我有以下代码:
int main(int argc, char **argv)
{
char *program;
char stringa[1000] = "";
int num = 123;
char snum[5];
program = argv[1];
sprintf(stringa, "./%s", program);
pid_t pid = fork();
if (pid < 0 ) {
perror("fork failed.");
exit(1); }
else if (pid == 0) {
char* args[] = {stringa, NULL};
execv(args[0], args);
}
else {
char procmon_str[] = "./procmon ";
num = pid;
sprintf(snum, "%d",num);
printf("PID of child is %s", snum);
char* args2[] = {procmon_str, snum, NULL};
execv(args2[0], args2);
sleep(20);
kill(num, SIGTERM);
sleep(2);
int parent_pid = getpid();
printf("PID of parent is %d", parent_pid);
kill(parent_pid, SIGTERM);
}
wait(NULL);
return 0;
}
这个想法是使用1个命令行参数调用程序,该参数是同一文件夹中另一个已编译的C程序的名称。
我想从C代码中执行该程序(因此使用fork()
),同时我想从parent
fork()
部分内启动另一个程序
child
fork()
部分中的部分完美无缺,但是当我在shell中运行时,它会立即显示Terminated
并且不会执行parent
中的代码{1}} fork()
的一部分。
为什么?
答案 0 :(得分:1)
您的程序调用{{1}}。现在父进程和子进程的执行并行进行。
孩子:
fork()
。args[]
并替换为作为参数提供的程序。父母与孩子并行:
execv()
。args2[]
并替换为execv()
。 ./procmon
以后的代码未到达,除非sleep(20)
失败(您未检查)。
再次阅读execv()
的手册页,然后重做程序的逻辑。