我讀到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);
}
和測試代碼的結果由圖所示(忽略了中國的結果,如果你無法理解): 我不知道爲什麼會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無效並執行並返回?
我剛測試過,你是對的!我會在後面標記你回答最喜歡的,非常感謝。 – cong
我曾經認爲execl返回和_exit(127)被執行,謝謝你的回答。 – cong