首页 > 解决方案 > 创建新进程时系统调用被阻塞(程序不会结束)

问题描述

我正在尝试使用克隆系统调用,有时程序不会结束。该程序只是使用克隆创建一个新进程并尝试执行 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;
}

标签: clinux

解决方案


当您用于clone创建稍后使用的新进程wait时,您需要传递到SIGCHLD(推荐,除非您想更改故意发送的信号)或传递或传递到. 请参阅和了解更多详情。由于您没有这样做,因此系统调用失败是因为没有任何东西可以等待,而不是等待子进程完成。这导致在您的 shell 提示符之后打印内容,这让您认为它仍在运行,即使它不是。如果您检查返回的结果,您会注意到这一点。flagsclone__WALL__WCLONEoptionswaitpidman 2 cloneman 2 waitpidwaitpidtest.txtwaitpid


推荐阅读