如何使用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 并导致无限循环。 这里有一个提示:远离vforkCLONE_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()让父进程和子进程同时运行?的主要内容,如果未能解决你的问题,请参考以下文章

C - 同时从两个管道(来自两个子进程的父进程)读取?

使用警报让父进程等待子进程几秒钟

什么是 kthreadd 进程和子进程以及它与 init 和子进程有何不同

如何捕获从 python 子进程运行的 git clone 命令的输出

如何阻止管道中的写入,直到读取发生? (在 C 中)

如何使用 fork() 将数字与父进程和子进程相加 [重复]