2014-01-12 93 views
0

我使用的是C.例如目前正在實施& &功能的外殼,如果我們輸入CMD1 & & CMD2,然後CMD2只有當執行CMD1成功退出。我在想:是否在子進程中返回的功能,可以在父進程捕獲

int main() { 
    int i; 
    char **args; 

    while(1) { 
     printf("yongfeng's shell:~$ "); 
     args = get_line(); 
     if (strcmp(args[0], "exit") == 0) exit(0);  /* if it's built-in command exit, exit the shell */ 
     if('&&') parse_out_two_commands: cmd1, cmd2; 
     if (execute(cmd1) != -1) /* if cmd1 successfully executed */ 
      execute(cmd2);  /* then execute the second cmd */ 
    } 
} 

int execute(char **args){ 
    int pid; 
    int status; /* location to store the termination status of the terminated process */ 
    char **cmd; /* pure command without special charactors */ 

    if(pid=fork() < 0){ //fork a child process, if pid<0, fork fails 
     perror("Error: forking failed"); 
     return -1; 
    } 

    /* child */ 
    else if(pid==0){    /* child process, in which command is going to be executed */ 
     cmd = parse_out(args); 
     /* codes handleing I/O redirection */ 

     if(execvp(*cmd, cmd) < 0){ /* execute command */ 
      perror("execution error"); 
      return -1; 
     } 
     return 0; 
    } 
    /* parent */ 
    else{   /* parent process is going to wait for child or not, depends on whether there's '&' at the end of the command */ 
     if(strcmp(args[sizeof(args)],'&') == 0){ 
      /* handle signals */ 
     } 
     else if (pid = waitpid(pid, &status, 0) == -1) perror("wait error"); 
    } 
} 

所以我使用另一個函數int execute(char ** args)來做實際的工作。它的返回類型是int,因爲我想知道該命令是否成功退出。但我不確定父進程是否可以從子進程獲得返回值,因爲它們是兩個不同的進程。

或者我應該決定是否要在子進程中執行第二個命令,通過分支另一個進程來運行它?非常感謝。

+0

與你的問題無關,但至少有兩個問題'strcmp(args [sizeof(args)],'&')' –

+0

閱讀[高級Linux編程](http://advancedlinuxprogramming.com/) –

回答

3

變化:

if(pid=fork() < 0){ //fork a child process, if pid<0, fork fails 

到:

if((pid=fork()) < 0){ //fork a child process, if pid<0, fork fails 

你設置pidfork() < 0結果,它不設置對孩子的PID。因此,除非fork()中有錯誤,否則父母和孩子都會設置pid0,所以他們都認爲他們是孩子。

關於​​函數的返回值:它將返回父代和子代。在每個過程中,它將返回​​中if的相應分支中的return語句中指定的內容。請注意,它execve()成功,孩子永遠不會返回,因爲它不再運行這個程序,它運行着被執行的程序。

如果孩子想要向父母發送成功或失敗信息,則通過呼叫exit(0)指示成功,並使用exit(some-nonzero-value)指示失敗,使用其退出狀態執行此操作。父母可以使用waitpid獲得退出狀態,然後從​​返回成功或失敗指示。

+0

哦,是的,我明白了。謝謝。但實際上我的問題是,是否可以在父進程中捕獲子進程中返回的值。也就是說,我是否可以寫if(execute(cmd1)!= -1)?謝謝。 –

+1

除了退出狀態,您可以使用'waitpid()'獲取子進程中沒有發生的任何情況。 – Barmar

+0

非常感謝。但在這裏我仍然不明白爲什麼execute函數將在父進程和子進程中都返回?如果我想實現&&功能,我應該只在兒童中運行一個cmd,如果兒童成功退出,我應該在父親中運行另一個cmd?我現在正在分派兩個孩子來做這件事。 –

相關問題