2017-04-30 81 views
0

我試圖並行運行三個execv(「./ test」,execv_str)。當每個execv()成功完成時,我需要打印出成功消息。fork()和exec()在C中並行運行

但現在我得到的結果如下:

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

預期的結果將是:

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

這裏是代碼。

#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"); 
      } 
     } 
    } 
} 

如何修改我的代碼使其工作?

+0

C不支持多線程 –

+1

@DeepeshChoudhary - 這個問題不涉及線程。 (並且請注意C實際上支持線程。) –

+0

@ Oliver Charlesworth真的嗎?請告訴我如何(或共享鏈接)。我很久以來就想在c中使用它。 –

回答

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); 
       } 

      } 
     } 
    } 
} 

在這裏,我會做什麼。在fork之後,我返回pid,檢查它是否不是0(所以我們在父進程中)並讓父親等待兒子。要打印「成功」,我綁定在子進程結束時觸發的SIGCHLD信號。請注意,這是一個小小的矯枉過正,並在waitpid完成這項工作後進行打印。 (但我喜歡綁定信號。)

+0

如果使用waitpid(),是否還在考慮並行運行?因爲當我檢查ps -aux | grep ./test,子進程是一個接一個產生的,不能並行運行。 – ELIJAH

+0

事實上,他們不是 –

+0

事實是,如果你想控制輸出順序,你必須等待一些進程 –