gpt4 book ai didi

c - execvp() - exit() 函数中的返回值

转载 作者:行者123 更新时间:2023-11-30 14:42:58 27 4
gpt4 key购买 nike

我最近一直在与以下概念作斗争,但我仍然无法理解它。我有这段代码

int foo(int f){
int fail = 10; //some random initialization value
int status;
pid_t child_pid;
child_pid = fork();

if(child_pid == 0) {
/* This is done by the child process. */

if (execvp(tokens2[0], tokens2)<0){
fail =1;
perror(tokens2[0]);
exit(1);
}
}else if(child_pid<0){
perror("Fork failed");
exit(1);
} else {
waitpid(child_pid, &status, WUNTRACED);
}

//handle execvp error return value
if (fail == 1){
return -1;
}else{
return 0;
}

}

它没有多大意义(不要介意 tokens2[] 数组,它已正确声明并且工作得很好),因为它采用抽象形式,以便它能够清晰易懂。问题是:函数foo的输出是什么?这就是我到目前为止所得到的:

1)If execvp succeeds, it does not return any value. If it fails it returns -1 (I think this return value does not have to do anything with my foo function).

2)exit(1) kills the child process and returns the control flow to the parent.

根据我的理解,如果execvp成功,foo应该返回-1(根据变量fail ),如果失败,它应该返回 0,但这不是我的 printf 在 main 函数上检查显示的内容。其实结果总是和我想象的相反。

PS:我发现了一些关于使用古老的shelf-pipe技巧进行execvp错误处理的信息,但它对我来说太吵了。我想要一种更简单的方法来处理错误。

最佳答案

The question is: what is the output of function foo?

您似乎在问 foo()返回值是多少。 “输出”通常是指写入终端或外部文件的数据。但问题仍然存在:在哪个过程中?假设fork()成功后,您将拥有两个几乎相同的进程,都执行 foo() .

1)If execvp succeeds, it does not return any value.

如果execvp()成功,它根本不返回

If it fails it returns -1 (I think this return value does not have to do anything with my foo function).

是的。只有您的子进程执行execvp()但是,如果它返回,该进程最终会调用 exit() .

2)exit(1) kills the child process and returns the control flow to the parent.

在进程从 foo() 返回之前终止该进程。 ,所以在子进程中foo()永远不会返回,是否 execvp成功与否。控制不会返回到父级。 fork 进程与调用函数完全不同。家长可以通过 waitpid() 了解 child 的退出代码称之为使。

在父级中,如果 fork()然后该进程也会失败,调用 exit()因此不会从 foo() 返回。假设fork()成功,另一方面,父进程会等待,直到子进程终止。子进程是一个单独的进程,拥有自己的所有变量副本,因此无论它对 fail 的副本做了什么,对 parent 没有影响。也就是说, fork 子进程也不像在同一进程中启动线程。

由于父级本身不修改 fail ,如果达到的话,它仍然有其初始值 10

    if (fail == 1){

10 != 1,所以如果 foo()确实返回则返回0。

关于c - execvp() - exit() 函数中的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54226466/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com