簡體   English   中英

使用execlp()運行C程序?

[英]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源文件,需要對其進行編譯(和鏈接)以生成可執行文件,然后運行該文件。 因此,您應該做類似的事情

  1. 首先編譯hello.c (我想您正在使用gcc

     gcc -o hello hello.c 
  2. 在第一個程序中像這樣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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM