2017-04-30 4 views
0

Ich versuche, drei execv ("./Test", execv_str) parallel zu laufen. Und ich muss Erfolgsmeldung ausdrucken, wenn jede von execv() erfolgreich abgeschlossen wird.fork() und exec() laufen parallel in C

Aber jetzt bekomme ich Ergebnis wie folgt:

[email protected]:~/Desktop/$./test -p 
SUCCESS 
SUCCESS 
SUCCESS 
[email protected]:~/Desktop/$ TESTING 
TESTING 
TESTING 

Das erwartete Ergebnis wird sein:

[email protected]:~/Desktop/$./test -p 
TESTING 
SUCCESS 
TESTING 
SUCCESS 
TESTING 
SUCCESS 
[email protected]:~/Desktop/$ 

Hier ist der Code ist.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int fork_execv() 
{ 
    int status; 
    pid_t pid; 

    pid = fork(); 

    /* Handling Child Process */ 
    if(pid == 0){ 
     char* execv_str[] = {"./test", NULL}; 
     if (execv("./test",execv_str) < 0){ 
      status = -1; 
      perror("ERROR\n"); 
     } 
    } 

    /* Handling Child Process Failure */ 
    else if(pid < 0){ 
     status = -1; 
     perror("ERROR\n"); 
    } 

    return status; 
} 

int main(int argc, char *argv[]){ 
    if (argc == 1){ 
     sleep(5); 
     printf("TESTING\n"); 
    } 
    else{ 
     int i; 
     for(i = 0; i < 3; ++i){ 
      if (fork_execv() != -1){ 
       printf("SUCCESS\n"); 
      } 
     } 
    } 
} 

Wie kann ich meinen Code ändern, damit er funktioniert?

+0

C unterstützt Multithreading nicht –

+1

@DepeshChoudhary - Diese Frage beinhaltet keine Threads. (Und beachten Sie, dass C in der Tat Threads unterstützt.) –

+0

@ Oliver Charlesworth Wirklich? Bitte sag mir wie (oder teile einen Link). Das wollte ich schon lange in c verwenden. –

Antwort

0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int fork_execv() 
{ 
    int status; 
    pid_t pid; 

    pid = fork(); 

    /* Handeling Chile Process */ 
    if(pid == 0){ 
     char* execv_str[] = {"./test", NULL}; 
     if (execv("./test",execv_str) < 0){ 
      status = -1; 
      perror("ERROR\n"); 
     } 
    } 

    /* Handeling Chile Process Failure */ 
    else if(pid < 0){ 
     status = -1; 
     perror("ERROR\n"); 
    } 

    return pid; 
} 
void handler(int sig){ 
    printf("SUCCESS\n"); 
} 
int main(int argc, char *argv[]){ 

    if (argc == 1){ 
     sleep(5); 
     printf("TESTING\n"); 
    } 
    else{ 

     int i; 
     pid_t process_id; 
     for(i = 0; i < 3; ++i){ 
      if ((process_id = fork_execv()) != -1){ 
       if(process_id != 0){ 
       signal(SIGCHLD, handler); 
       waitpid(process_id, NULL, 0); 
       } 

      } 
     } 
    } 
} 

Hier was ich tun würde. Nach der Gabel gebe ich das Pid zurück, überprüfe ob es nicht 0 ist (also sind wir im Vaterprozess) und lass den Vater auf den Sohn warten. Um "Erfolg" zu drucken, binde ich das SIGCHLD-Signal, das ausgelöst wird, wenn ein Kindprozess endet. Beachten Sie, dass dies ein wenig Overkill ist und drucken, nachdem die Waitpid den Job erledigt hätte. (Aber ich mag Signal zu binden.)

+0

Wenn Sie waitpid() verwenden, zieht das noch die parallele Ausführung in Betracht? Denn wenn ich ps -aux | überprüfe grep ./test, die untergeordneten Prozesse werden nacheinander erzeugt und laufen nicht parallel zusammen. – ELIJAH

+0

In der Tat sind sie nicht –

+0

Die Tatsache ist, dass, wenn Sie die Reihenfolge der Ausgabe steuern möchten, müssen Sie einige Prozess warten –