[英]Running a C program using execlp()?
因此,我有一个名为“ 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);
}
您无法运行C源文件,需要对其进行编译(和链接)以生成可执行文件,然后运行该文件。 因此,您应该做类似的事情
首先编译hello.c
(我想您正在使用gcc
)
gcc -o hello hello.c
在第一个程序中像这样hello
execlp("./hello", "hello", NULL);
然后,您应该得到期望的结果。
(不仅)要更好地理解代码中的含义,请添加错误检查。
在您的特定情况下,至少将其添加到对execlp()
的调用中。 为此,请先查看exec*()
的文档:
返回值
exec()函数仅在发生错误时返回。 返回值为-1,并且将errno设置为指示错误。
然后增强您的代码以解决这种情况:
...
}
else /* child */
{
if (-1 == execlp("hello.c"))
{
perror("execlp() failed");
return 1;
}
}
return 0;
}
您将观察到有关execlp()
调用的错误消息。
这是由于hello.c
最有可能不是可执行文件,而是普通文本文件C- source 。
仔细阅读文档,您会读到:
参数列表必须以空指针终止,并且由于它们是可变参数函数,因此该指针必须强制转换为(char *)NULL。
从中我们了解到,对exec*()
函数家族的execl*()
成员的调用将始终像这样结束:
execlp(..., (char *) NULL)
仅添加为什么在这种情况下总是返回零
这是因为当execlp失败并返回-1时,父进程在主函数的末尾使用返回值,即在这种情况下为0。 如果将其更改为2或3,则如果check == 3或== 2,您将看到程序按该代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.