2017-09-06 342 views
0

我讀到APUE 3rd,8.13,系統功能,我就看見一個版本的系統功能,實現無信號handling.Code是象下面這樣:execl在Linux中如何處理「/ bin/sh」?

#include <sys/wait.h> 
#include <errno.h> 
#include <unistd.h> 

int system(const char *cmdstring) /* version without signal handling */ 
{ 
    pid_t pid; 
    int  status; 

    if (cmdstring == NULL) 
     return(1);  /* always a command processor with UNIX */ 

    if ((pid = fork()) < 0) { 
     status = -1; /* probably out of processes */ 
    } else if (pid == 0) {    /* child */ 
     execl("/bin/sh", "sh", "-c", cmdstring, (char *)0); 
     _exit(127);  /* execl error */ 
    } else {       /* parent */ 
     while (waitpid(pid, &status, 0) < 0) { 
      if (errno != EINTR) { 
       status = -1; /* error other than EINTR from waitpid() */ 
       break; 
      } 
     } 
    } 

    return(status); 
} 

而且代碼用於測試系統功能的這個版本是一樣如下:

int main(void) 
{ 
    int  status; 

    if ((status = system("date")) < 0) 
     err_sys("system() error"); 

    pr_exit(status); 

    if ((status = system("nosuchcommand")) < 0) 
     err_sys("system() error"); 

    pr_exit(status); 

    if ((status = system("who; exit 44")) < 0) 
     err_sys("system() error"); 

    pr_exit(status); 

    exit(0); 
} 

和測試代碼的結果由圖所示(忽略了中國的結果,如果你無法理解): test code result 我不知道爲什麼會EXECL回報,如果「nosuchcommand」 ,這是無效的/ bin/sh被賦予/ bin/sh。在我看來,execl只是替換當前進程的代碼,然後從入口點運行,即使「nosuchcommand」對於/ bin/sh無效,它與execl和/ bin/sh無關。那麼,execl如何知道「nosuchcommand」對於/ bin/sh執行並返回是無效的呢?在執行/ bin/sh之前,通過檢查給/ bin/sh的命令,execl可以對/ bin/sh進行不同的處理,以便事先知道給/ bin/sh的無效參數?我知道execl不會以不同的方式處理/ bin/sh,因此,execl如何知道「nosuchcommand」對於/ bin/sh無效並執行並返回?

回答

1

sh -c nosuchcommand本身返回127.這是return codes with a special meaning之一。

所以我不認爲你在這種情況下看到execl實際返回。

+0

我剛測試過,你是對的!我會在後面標記你回答最喜歡的,非常感謝。 – cong

+0

我曾經認爲execl返回和_exit(127)被執行,謝謝你的回答。 – cong

1

它不「知道」。它只是執行你告訴它的內容。 /bin/sh然後報告它找不到它,之後/bin/sh以非零退出碼退出,在這種情況下爲127

另請注意,您不能依賴它返回確切的返回值,因爲這是特定於shell的。一些shell(包括某些操作系統上的/bin/sh)將返回1

+0

我以前認爲execl返回和_exit(127)被執行,謝謝你的回答,但以下回答在你之前,所以我會標記他的最愛,對不起。 – cong