我正在尝试使用克隆系统调用,有时程序不会结束。这个程序只是使用clone创建一个新进程,并尝试执行cat命令。这是程序:
#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <unistd.h>
int childFunc(void*arg)
{
char* paramlist[] = {"/bin/cat", "test.txt", NULL};
execv("/bin/cat",paramlist);
_exit(1);
}
int main(void) {
int STACKSIZE = 65536;
void* stack;
stack = malloc(STACKSIZE);
int ret = clone(childFunc, stack + STACKSIZE, 0, NULL);
waitpid(ret, NULL, 0);
free(stack);
return 0;
}
当您使用clone
创建一个新进程,以便稍后使用wait
时,您需要将flags
中的SIGCHLD
传递给clone
(推荐使用,除非您想更改故意发送的信号(,或者将options
中的__WALL
或__WCLONE
传递给waitpid
。详见man 2 clone
和man 2 waitpid
。由于您没有这样做,waitpid
系统调用失败的原因是没有任何东西可以等待,而不是等待子进程完成。这导致test.txt
的内容在shell提示后被打印出来,这让您认为它仍然在运行,尽管它没有运行。如果检查waitpid
返回的结果,您会注意到这一点。