c - 创建新进程时系统调用被阻塞(程序不会结束)
问题描述
我正在尝试使用克隆系统调用,有时程序不会结束。该程序只是使用克隆创建一个新进程并尝试执行 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
时,您需要传递到SIGCHLD
(推荐,除非您想更改故意发送的信号)或传递或传递到. 请参阅和了解更多详情。由于您没有这样做,因此系统调用失败是因为没有任何东西可以等待,而不是等待子进程完成。这导致在您的 shell 提示符之后打印内容,这让您认为它仍在运行,即使它不是。如果您检查返回的结果,您会注意到这一点。flags
clone
__WALL
__WCLONE
options
waitpid
man 2 clone
man 2 waitpid
waitpid
test.txt
waitpid
推荐阅读
- setuptools - setup.py sdist 如何取消引用符号链接?
- pandas - 从 SQL Alchemy 到 Pandas - 代码以前在 2.7 上工作,而不是在 3.7 上工作
- php - 使用 Laravel 在控制器中增加整数
- python - 如何在pygame中将数组可视化为线?
- postgresql - 如何从 Postgres 中的相同两个连接表中插入两个表
- php - 如何在hasMany关系Laravel中呈现来自不同表的数据?
- html - 动画完成后如何阻止文本移动?
- javascript - 动态构建函数?
- installshield - 谁能解释Installshield在创建setup.exe的副本时在做什么,它称之为伪随机,如_is12345.exe?
- sql-server - 从 Unicode 代码点长度导出数据库字段的字符长度