[英]Running a C program using execlp()?
因此,我有一個名為“ hello.c”的交流程序,該程序最后只執行“ exit(2)”。 我嘗試在子進程中運行它,然后將返回值傳遞給父進程並打印適當的消息。 但是以某種方式,程序總是在0退出並顯示“在0退出”消息。 有人可以告訴我為什么嗎?
pid_t pid;
int status;
pid = fork();
if (pid == -1){
perror("fork");
exit(1);
}
if (pid >0){
/*abusive parents*/
waitpid(pid, &status, 0);
if(WEXITSTATUS(status)==3){
printf("exit at 3\n");
}
if(WEXITSTATUS(status)==2){
printf("exit at 2\n");
}
if(!(WEXITSTATUS(status))){
printf("exit at 0\n");
}
}
else{
/*stupid child*/
execlp("hello.c",NULL);
}
return 0;}
這是hello.c:
int main(void){
int teemo=0;
exit(2);
}
您無法運行C源文件,需要對其進行編譯(和鏈接)以生成可執行文件,然后運行該文件。 因此,您應該做類似的事情
首先編譯hello.c
(我想您正在使用gcc
)
gcc -o hello hello.c
在第一個程序中像這樣hello
execlp("./hello", "hello", NULL);
然后,您應該得到期望的結果。
(不僅)要更好地理解代碼中的含義,請添加錯誤檢查。
在您的特定情況下,至少將其添加到對execlp()
的調用中。 為此,請先查看exec*()
的文檔:
返回值
exec()函數僅在發生錯誤時返回。 返回值為-1,並且將errno設置為指示錯誤。
然后增強您的代碼以解決這種情況:
...
}
else /* child */
{
if (-1 == execlp("hello.c"))
{
perror("execlp() failed");
return 1;
}
}
return 0;
}
您將觀察到有關execlp()
調用的錯誤消息。
這是由於hello.c
最有可能不是可執行文件,而是普通文本文件C- source 。
仔細閱讀文檔,您會讀到:
參數列表必須以空指針終止,並且由於它們是可變參數函數,因此該指針必須強制轉換為(char *)NULL。
從中我們了解到,對exec*()
函數家族的execl*()
成員的調用將始終像這樣結束:
execlp(..., (char *) NULL)
僅添加為什么在這種情況下總是返回零
這是因為當execlp失敗並返回-1時,父進程在主函數的末尾使用返回值,即在這種情況下為0。 如果將其更改為2或3,則如果check == 3或== 2,您將看到程序按該代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.