2017-12-07 3 views
-2
wollte

Ich habe die unten C-Code in Linux (gcc):einen übergeordneten Prozess warten lassen und Linux-Befehl so oft laufen, wie

void doWho(void) 
{ 
     char entry[10]; 
     int ret, i; 
     ret = read(0, entry, 10); 
     if (*entry == 'u') 
     { 
       for(i=0; i<3; i++) 
       { 
       execl("/usr/bin/who","who",NULL); 
       } 
     } 
} 

int main(int argc, char *argv[]) 
{ 
     int childpid; 

     printf("Before it forks\n"); 
     childpid = fork(); 

     if(childpid == 0) 
     { 
       printf("This is a child process\n"); 
       doWho(); 
       exit(0); 
     } else 
     { 
       printf("This is the parent process\n"); 
       wait(NULL); 
     } 

     return 0; 
} 

ich den übergeordneten Prozess wollen auf unbestimmte Zeit und laufen noch zu halten „, die "Jedes Mal, wenn ich die" u "-Taste drücke. Ich bekomme nur einmal den gewünschten Effekt, und dann werden die Kind- und Elternprozesse beendet. Irgendwelche Hilfe dazu?

+2

Ich denke, Sie müssen [lesen Sie mehr über die 'exec' Familie von Funktionen] (http://man7.org/linux/man-pages/man3/exec.3.html) und wie sie funktionieren. Kurz gesagt: Die Schleife sollte über die 'fork'- und' doWho'/'wait'-Aufrufe sein. –

+0

Warum brauchen Sie das mit Gabel? Sie können es auch mit einem einfachen C-Programm tun? – Gaurav

+0

Dies ist eine Zuweisung, mein Code wäre erforderlich, um untergeordnete Prozesse zu erstellen, um einen Linux-Befehl jedes Mal auszuführen, wenn ich einen bestimmten Schlüssel – Sergio

Antwort

0

unter Schleife beachten:

for(i=0; i<3; i++) 
{ 
    execl("/usr/bin/who","who",NULL); 
} 

Es ist egal, wie oft Sie die Schleife drehen, wird es nur once ausgeführt werden, da, wenn child process zu laufen beginnt (PCB erstellt), die Sie anrufen Funktion doWho dann die Kontrolle kommt zu doWho Funktion und in doWho Funktion was machst du? execl(). was execl() tut, ist, dass "es replaces aktuelle Prozess (child) mit new Prozess nach, wenn i = 0 ganze child process image mit new einem mit execl() ersetzt wurde, so gibt es nichts mehr in den Kindern Prozess, der ist, warum es nur ein einziges Mal ausgeführt wird.

wenn Sie so viele ausführen möchten, wie Sie fork() in der Funktion verwendet werden soll, da dann execevery process created by fork() ersetzen wird, aber es ist nicht zu laufen fork() in Schleife geraten, weil Ihr Programm zum Absturz bringen kann, wenn es nicht mehr Ressourcen zur Verfügung.

Ersetzen Sie also Ihre doWho Funktion als

void doWho(void) 
{ 
     char entry[10] = {0}; 
     int ret, i; 

     for(; ;) { 
     /** who command will be executed when ever condition is true **/ 
       ret = read(0, entry, 10); 
       __fpurge(stdin);//to clear stdin buffer everytime 
       if (*entry == 'u') { 

         if(fork()==0)//only this newly created process will be replaces by execl not one was in main() 
           execl("/usr/bin/who","who",NULL); 
         else 
           ;// this parents does nothing 
       } 
     } 
} 

Ich hoffe, es hilft.

+0

Danke! es funktioniert perfekt. _fpurge (stdin) wird vom Compiler abgelehnt, auch wenn ich stdio_ext.h einbeziehe, aber ich werde es versuchen. – Sergio

+0

ja fpurge() ist nicht standardgemäß und nicht portierbar, wie in Manpage erwähnt. Möglicherweise unterstützt dein Compiler das nicht. – achal

Verwandte Themen