如何使用clone()让父进程和子进程同时运行?
Posted
技术标签:
【中文标题】如何使用clone()让父进程和子进程同时运行?【英文标题】:How to use clone() to make parent process and child process run at the same time? 【发布时间】:2014-07-08 06:29:14 【问题描述】:我是 Linux 新手。我想同时制作子进程和父进程。但我失败了。这是我的代码。有人可以帮帮我吗?
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sched.h>
#include <signal.h>
#define FIBER_STACK 8192
void * stack;
int do_something()
int a = 0;
while (a<10)
printf("pid : %d, a = %d\n", getpid(), a++);
exit(1);
int main()
void * stack;
stack = malloc(FIBER_STACK);
if(!stack)
printf("The stack failed\n");
exit(0);
int a = 0;
if (c == 0)
clone(&do_something, (char *)stack + FIBER_STACK, CLONE_VM|CLONE_VFORK, 0);
while (a<10)
printf("pid : %d, a = %d\n", getpid(), a++);
free(stack);
exit(1);
我希望它们同时运行,但父进程要等到子进程完成。
【问题讨论】:
请阅读clone
的手册页,尤其是关于CLONE_VFORK
的部分。
@Mat 我知道。我尝试使用 execve 使父进程继续运行。但它会重新启动我的 main 并导致无限循环。
这里有一个提示:远离vfork
和CLONE_VFORK
,它们很奇怪。使用普通的fork
而不是clone
。并且永远不要丢弃来自 fork(或克隆,或其他系统调用)的返回代码,您绝对需要检查它。还要在你的循环中添加一些睡眠/等待的形式,否则它会在大多数时候运行得太快,你看它是否有效。
@Mat 其实,学习如何使用克隆是我的功课。我也会尝试学习 fork,但我也必须学习使用 clone。你能教我吗?
【参考方案1】:
来自clone
CLONE_VFORK(自 Linux 2.2 起) 如果设置了CLONE_VFORK,调用进程的执行是 暂停,直到孩子释放其虚拟内存 通过调用 execve(2) 或 _exit(2) 获取资源(与 vfork(2))。
如果没有设置 CLONE_VFORK,那么调用进程和 孩子在通话后可以安排,并提出申请 不应依赖于任何特定的执行 顺序。
这意味着对于CLONE_VFORK
,它应该等到孩子完成或执行exec
。
由于您在子程序中运行函数,因此不需要exec
。忽略CLONE_VFORK
clone(&do_something, (char *)stack + FIBER_STACK, CLONE_VM, 0);
并且父子节点将同时运行。
【讨论】:
我也看到了。但我真的不知道如何使用 execve。你能根据我的实践给我一个例子吗?谢谢以上是关于如何使用clone()让父进程和子进程同时运行?的主要内容,如果未能解决你的问题,请参考以下文章
什么是 kthreadd 进程和子进程以及它与 init 和子进程有何不同