在Linux中创建独立的过程
Create independent process in Linux
我希望实现类似于CreateProcess但在Linux上的函数。我做了很多研究,发现了使用双叉在init下运行孩子的"叉子脱落和死亡"方法。也就是说,允许孩子独立于父母操作。
因为父母需要返回有关新创建的子进程(即pid,name等)的信息,所以我需要知道我是否遇到了代码中的竞赛条件。目前,我叉并检索第二个叉子的PID通过管道,然后等待第一个叉子退出。
int child = 0;
int fd[2] = { 0, 0 };
if (pipe (fd) != 0)
return Process();
int pid = fork();
if (pid < 0)
return Process();
if (pid == 0) // Child
{
if (setsid() != -1)
{
child = fork();
if (child == 0)
{
umask (0); // Reset umask
close (0); // Close stdin
close (1); // Close stdout
close (2); // Close stderr
execvp ( ... );
_exit (0);
}
// Do I need waitpid (child) here?
}
// Write the child PID using the pipe
write (fd[1], &child, sizeof (child));
_exit (0);
}
else // Parent
{
// Read the child PID using the pipe
read (fd[0], &child, sizeof (child));
// Remove zombie process
waitpid (pid, nullptr, 0);
// Child must finish exec by this point
return Process (child);
// Also gets name
}
问题:
- 我是否需要第二个等待件才能等待孩子完成执行官?
- WaitPid会在exec的电话时返回吗?
- waitpid返回即使在waitpid之前被召集或执行?
您不需要在第二个孩子上 waitpid()
。当一个过程的父母死亡时,孩子将被init
流程采用,因此不会有僵尸过程。
waitpid()
仅在孩子等待出口后才返回。在孩子中打电话给execvp()
意味着服务员等待直到执行死亡的程序,因为那是孩子死亡的时候。
waitpid()
将获得该过程的退出状态。该过程何时真正退出并不重要。
(一点澄清:您称之为孩子,实际上是您的孙子。这是该过程的孩子,只是分叉并死了。)
我是否需要第二个等待件才能等待孩子完成执行官?
你不能。这是您的孙子,您只能等待直接的孩子。此外,由于您的孙子的父母已经去世,因此您的孙子现在已经被调整为Init(因此实际上是您的前孙子)。
waitpid会在通话中返回exec吗?
给定的PID死亡/退出时,等待pid返回,或者如果已经是僵尸,则立即返回。高管在孙子中被召唤。您的等待电话完全不关心不是您的直接孩子的过程(除非您使用的是仅使用Linux的儿童提取功能)。
即使在waitpid之前召集了waitpid返回?
等待只有在PID上等待(必须是您的直接孩子)死亡时才返回。如果尚未这样,它将阻止。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 独立读取-修改-写入顺序
- 是否删除在对象构造过程中创建的对象
- 带有多个独立参数的C++For循环
- 如何在鼠标挂钩过程中检测拖动
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- clang 插件:在编译过程中修改 AST
- 如何使变量从 x 到 y,然后从 y 返回到 x 并始终重复该过程
- 在C++中调用 MS SQL 存储过程
- 阻塞信号会导致升压过程不起作用
- 通过命令行在Visual Studio中编译单个独立文件
- 如何将独立的 c 应用程序组合到 c++ 应用程序中?
- 我们能否在stm32f中使用硬件定时器控制两个独立的进程
- Adafruit 羽毛RFM69HCW在使用过程中会冻结,需要硬重置
- antlr 规则上下文是否可以独立于目标
- 使用提升过程获取 shell 命令的标准输出
- 附加到 gdb 会中断并且不会继续该过程
- 如何创建始终在线的过程?
- 在Linux中创建独立的过程