c-创建新进程时系统调用被阻塞(程序不会结束)



我正在尝试使用克隆系统调用,有时程序不会结束。这个程序只是使用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 cloneman 2 waitpid。由于您没有这样做,waitpid系统调用失败的原因是没有任何东西可以等待,而不是等待子进程完成。这导致test.txt的内容在shell提示后被打印出来,这让您认为它仍然在运行,尽管它没有运行。如果检查waitpid返回的结果,您会注意到这一点。

最新更新