[英]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
、 _Exit
或quickexit
,則將值傳遞給該例程。abort
,實現定義的不成功終止。main
的初始調用執行return
, return
語句中給出的值。main
的初始調用的執行流向其終止}
,則為零。 waitpid
不執行這些操作,也不影響程序退出狀態。 要將退出狀態的 127 發送到主機環境,您應該執行exit(127)
或return 127;
在錯誤之后perror("error");
或者在main
的末尾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.