所以我有一个名为“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);
}
答案 0 :(得分:2)
您无法运行C源文件,需要编译(并链接)它以生成可执行文件,并运行此文件。因此,您应该执行类似
的操作首先编译hello.c
(我想您正在使用gcc
)
gcc -o hello hello.c
在您的第一个程序中运行hello
,如下所示
execlp("./hello", "hello", NULL);
然后你应该得到你所期望的。
答案 1 :(得分:1)
(不仅)为了更好地了解代码中发生的事情,添加错误检查。
在您的具体情况下,至少将其添加到execlp()
的调用中。首先,请查看exec*()
s documentation:
返回值
exec()函数仅在发生错误时才返回。返回值为-1,并设置errno以指示错误。
然后增强代码以涵盖这种情况:
...
}
else /* child */
{
if (-1 == execlp("hello.c"))
{
perror("execlp() failed");
return 1;
}
}
return 0;
}
您将观察到有关对execlp()
的调用的错误消息。
这导致hello.c
很可能不是可执行文件,而是普通文本文件,C- 来源。
查看documentation更接近的人:
列表 参数必须由空指针终止,因为它们是 可变参数函数,必须将此指针强制转换为(char *)NULL。
据此我们了解到,对execl*()
系列函数的exec*()
成员的调用总是这样结束:
execlp(..., (char *) NULL)
答案 2 :(得分:0)
添加为什么在这种情况下它总是返回零
这是因为当execlp失败并返回-1时,父进程在main函数的末尾使用返回值,在这种情况下为0。如果将其更改为2或3,您将看到程序使用if check == 3或== 2来命中该代码。