如何在fork()中获取execvp的错误?

如何在fork()中获取execvp的错误?,c,fork,execvp,C,Fork,Execvp,我有以下代码 我的问题在密码里 int main() { .... if ((uproc.pid = fork()) == -1) { return -1; } if (uproc.pid == 0) { /* child */ const char *argv[3]; int i = 0;

我有以下代码

我的问题在密码里

     int main() {

            ....

         if ((uproc.pid = fork()) == -1) {
            return -1;
        }

        if (uproc.pid == 0) {
            /* child */

            const char *argv[3];
            int i = 0;
            argv[i++] = "/bin/sh";
            argv[i++] =  "/my/script.sh";
            argv[i++] = NULL;

            execvp(argv[0], (char **) argv);
            exit(ESRCH);

        } else if (uproc.pid < 0)
            return -1;

        /* parent */
        int status;
        while (wait(&status) != uproc.pid) {
            DD(DEBUG,"waiting for child to exit");
        }

           // If /my/script.sh exit accidentally in some place with error. 
           // can I catch this error right here?
          ......
    }
intmain(){
....
如果((uproc.pid=fork())==-1){
返回-1;
}
如果(upoc.pid==0){
/*孩子*/
常量字符*argv[3];
int i=0;
argv[i++]=“/bin/sh”;
argv[i++]=“/my/script.sh”;
argv[i++]=NULL;
execvp(argv[0],(char**)argv);
退出(ESRCH);
}否则如果(uproc.pid<0)
返回-1;
/*母公司*/
智力状态;
while(等待(&status)!=uproc.pid){
DD(调试,“等待子项退出”);
}
//如果/my/script.sh在某个地方意外退出并出现错误。
//我能在这里发现这个错误吗?
......
}

孩子的退出状态由
等待
函数在
状态
变量中提供

您可以使用
WEXITSTATUS
宏获取退出状态,但仅当程序正常退出时(即调用
exit
或从其
main
函数返回):


有关更多信息,请阅读。

子项的退出状态由
等待
函数在
状态
变量中提供

您可以使用
WEXITSTATUS
宏获取退出状态,但仅当程序正常退出时(即调用
exit
或从其
main
函数返回):


阅读获取更多信息。

您通过
等待
函数进入,它位于
状态变量中。它可能是对我的问题的响应状态始终为0。如果您通过
wait
函数输入的脚本中没有错误,则它位于
status
变量中。它可能是对我的问题的响应状态始终为0。如果没有错误,如果OP的脚本中有错误,则不清楚(“…执行cmd的错误…”)是否确实是所需的退出代码。无论如何,1 +,因为这是所有人可以得到的。我的脚本退出中间的消息错误,因为在中间有一个错误。状态返回始终为0(在cas中,脚本中有错误,而在cas中没有),因此为什么不更改此设置,并让脚本仅在成功的情况下使用
exit 0
,并且在任何错误调用
exit
时使用与
0
不同的参数@MohamedKALLELTo要使脚本在由脚本启动的进程异常终止时做出反应,您可以使用
陷阱
。在这里可以找到一篇关于使脚本更加健壮的有趣文章:@MohamedKALLELFrom the OP不清楚(“…执行cmd的错误…”)它是否真的是想要的退出代码。无论如何,1 +,因为这是所有人可以得到的。我的脚本退出中间的消息错误,因为在中间有一个错误。状态返回始终为0(在cas中,脚本中有错误,而在cas中没有),因此为什么不更改此设置,并让脚本仅在成功的情况下使用
exit 0
,并且在任何错误调用
exit
时使用与
0
不同的参数@MohamedKALLELTo要使脚本在由脚本启动的进程异常终止时做出反应,您可以使用
陷阱
。在这里可以找到一篇关于让脚本更加健壮的有趣文章:@MohamedKALLEL
if (WIFEXITED(status))
    printf("Child exit status: %d\n", WEXITSTATUS(status));
else
    printf("Child exited abnormally\n");