簡體   English   中英

出錯時進程的退出狀態不好

[英]Exit status of process not good in case of error

我有一個關於迷你程序的問題,如果在 execve 期間發生錯誤,它將返回我的子進程的退出狀態。

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>




int main ()
{
    char *argv[] = {"ls",NULL};
    char *envp[] = {NULL};
    int status;
    int pid;
    int err;
    pid = fork();
    if (pid == 0)
    {
        execve("/usr/bin/lds", argv, envp);
        perror("error");
        
    }
    else
    {
    waitpid(pid, &status, 0);
    printf("%d\n", status);
    if (WIFEXITED(status))
        err = WEXITSTATUS(status);
    exit(status);
    }
}

上面的代碼只是演示,讓我了解進程退出狀態是如何工作的,問題是當我輸入錯誤的路徑如 /usr/bin/lds 時,狀態代碼打印為 0 而我的子進程發生錯誤,而當在 bash 中找不到命令 發回的狀態代碼是 127 我的問題是如何讓它像 bash 輸入錯誤命令時那樣返回 127?

exec(2)系列函數在失敗時返回-1 所以無法得到shell的返回碼。

您的代碼當前為孩子的狀態返回 0,因為您沒有返回任何錯誤,因此子進程返回 0 退出 main。

你可以改為:

if (pid == 0)
{
    int r = execve("/usr/bin/dls", argv, envp);
    perror("error");
    exit(r);
}

您還可以檢查 errno 並將特定值從子項返回給父項:

if (pid == 0)
{
    int r = execve("/usr/bin/dls", argv, envp);
    exit(errno);
}

父母可以檢查孩子的返回碼並打印適當的消息或返回值。

或者,您可以 map 將execve返回的 errno 值轉換為 shell 的返回值,然后自己返回這些值,以便它與 shell 的返回值匹配。

if (pid == 0)
{
    int r = execve("/usr/bin/dls", argv, envp);
    if (errno == ENOENT)
        exit(127);
    else if (errno == ...)
    /* and so on */
}

這是更多的工作,但收效甚微。 通常,您只需要知道 exec 何時失敗,而不是 shell 在失敗時返回的確切內容。

從程序發送到主機環境的退出狀態是:

  • 如果程序調用exit_Exitquickexit ,則將值傳遞給該例程。
  • 如果程序調用abort ,實現定義的不成功終止。
  • 如果對main的初始調用執行returnreturn語句中給出的值。
  • 如果對main的初始調用的執行流向其終止} ,則為零。

waitpid不執行這些操作,也不影響程序退出狀態。 要將退出狀態的 127 發送到主機環境,您應該執行exit(127)return 127; 在錯誤之后perror("error"); 或者在main的末尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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