我尝试使用以下代码编写简单的fork-and-exec应用程序
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
int
spawn(char *program, char *arg_list[])
{
pid_t child_pid;
child_pid = fork();
if (child_pid != 0)
return child_pid;
else {
execvp(program, arg_list);
fprintf(stderr, "an error occured\n");
exit(EXIT_FAILURE);
}
}
int
main()
{
int child_stat;
char *arg_list[] = {
"ls",
"-l",
"/",
NULL
};
spawn("ls", arg_list);
printf("return to parent\n");
return 0;
}
一切顺利,但是成为ls后的孩子不会终止。 壳看起来像 。/主要 回到父母 - 这里输出ls -
但是命令提示符没有出现,所以我假设一个进程挂起,原因对我来说并不明显。请你指出我的错误。 提前谢谢。
答案 0 :(得分:0)
我相信它运作正常。但是,子项和父项的执行顺序不是您所期望的,因此您会看到您不理解的输出。在我的Arch linux框(内核4.xx)上,它工作正常,但父进程首先返回,让ls
覆盖并以其他方式使命令提示符乱码。对子进程执行wait()
以按特定顺序执行执行。在spawn()
电话后添加几行代码:
spawn("ls", arg_list);
printf("return to parent\n");
wait(&child_stat);
printf("Waited on child\n");
return 0;
在fork()
调用之后,父进程将调用wait()
,直到子进程(如果至少有一个)退出时才会返回ls
。由于只有一个子进程,{<1}}的输出在命令提示符被写出之前发生,因此您将看到您认为应该看到的内容。