在c中创建连续的子进程

在c中创建连续的子进程,c,C,我希望创建一个顺序过程,该过程将创建指定数量的子对象。例如,如果父进程ID为769,则进程将如下所示: 769(parent) -> 770(first child) -> 771(grand child) ... -> xx (n*grand child) 根据我想要的孩子的数量。孩子的PID并不重要,只要他们是连续的并且没有兄弟姐妹 int main(int argc, char **argv) { int i; int iterations;

我希望创建一个顺序过程,该过程将创建指定数量的子对象。例如,如果父进程ID为769,则进程将如下所示:

769(parent) -> 770(first child) -> 771(grand child) ... -> xx (n*grand child)
根据我想要的孩子的数量。孩子的PID并不重要,只要他们是连续的并且没有兄弟姐妹

int main(int argc, char **argv) {
    int i;
    int iterations;

    if (argc != 2) {
        fprintf(stderr, "Usage: forkloop <iterations>\n");
        exit(1);
    }

    iterations = strtol(argv[1], NULL, 10);

    int n = fork();
    for (i = 0; i < iterations; i++) {
        if(n == 0) {
            printf("ppid = %d, pid = %d, i = %d\n", getppid(), getpid(), i);
            n = fork();
        }
        if (n < 0) {
            perror("fork");
            exit(1);
        }
       //printf("ppid = %d, pid = %d, i = %d\n", getppid(), getpid(), i);
    }
    // printf("ppid = %d, pid = %d\n", getppid(), getpid());
    return 0;
}
int main(int argc,char**argv){
int i;
整数迭代;
如果(argc!=2){
fprintf(stderr,“用法:forkloop\n”);
出口(1);
}
迭代次数=strtol(argv[1],NULL,10);
int n=fork();
对于(i=0;i

我已经做到了,但我认为这有点错误。有人能帮忙吗?

仔细思考逻辑。你很近,但需要更近一点。这项工作:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    if (argc != 2)
    {
        fprintf(stderr, "Usage: forkloop <iterations>\n");
        exit(1);
    }

    int iterations = strtol(argv[1], NULL, 10);
    if (iterations < 1 || iterations > 20)
    {
        fprintf(stderr, "invalid iterations %d (1..20 allowed)\n", iterations);
        exit(1);
    }
    printf("Initial process: PID %d (parent %d)\n", (int)getpid(), (int)getppid());
    fflush(stdout);
    int i;
    for (i = 0; i < iterations; i++)
    {
        int pid = fork();
        if (pid < 0)
        {
            perror("fork");
            exit(1);
        }
        else if (pid == 0)
        {
            /* Child - report ID */
            printf("ppid = %d, pid = %d, i = %d\n", getppid(), getpid(), i);
            fflush(stdout);
        }
        if (pid != 0)
        {
            /* Parent - break loop and wait for kid (and grandkid, and ...) to die */
            break;
        }
    }

    int corpse;
    int status;
    while ((corpse = wait(&status)) > 0)
    {
        printf("PID %d: child %d exited with status 0x%.4X\n",
               (int)getpid(), corpse, status);
        fflush(stdout);
    }

    return i;
}

在运行此测试时,我没有任何其他进程主动生成子进程。

您不能保证子进程具有连续的编号;其他一些过程也可能产生子代并获取您希望的数字之一。在某些系统(运行在更安全模式下的系统)上,子PID是故意随机化的。哦,是的,我不介意数字相同或连续,我只需要创建n个没有兄弟姐妹的子-子进程。您是否希望PID 769成为770、771、772……中每一个的父进程。。。或者你希望769是770的父母,770是771的父母,771是772的父母。。。?你需要确保你的流程在适当的时候退出——等待(所有)他们的后代死亡(孩子们都会自杀;这是一件病态的事情!)从您的更新判断,您将771归类为“第二个孩子”,但它是“第二代”或“孙子”,而不是770的兄弟姐妹。后者正是我想要的,770是771的父母,771是772的父母,等等,我希望现在清楚了
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes \
>     -Wstrict-prototypes kids17.c -o kids17 
$ kids17
Usage: forkloop <iterations>
$ kids17 4
Initial process: PID 2686 (parent 888)
ppid = 2686, pid = 2687, i = 0
ppid = 2687, pid = 2688, i = 1
ppid = 2688, pid = 2689, i = 2
ppid = 2689, pid = 2690, i = 3
PID 2689: child 2690 exited with status 0x0400
PID 2688: child 2689 exited with status 0x0300
PID 2687: child 2688 exited with status 0x0200
PID 2686: child 2687 exited with status 0x0100
$ …some work done…
$ kids17 10
Initial process: PID 2704 (parent 888)
ppid = 2704, pid = 2705, i = 0
ppid = 2705, pid = 2706, i = 1
ppid = 2706, pid = 2707, i = 2
ppid = 2707, pid = 2708, i = 3
ppid = 2708, pid = 2709, i = 4
ppid = 2709, pid = 2710, i = 5
ppid = 2710, pid = 2711, i = 6
ppid = 2711, pid = 2712, i = 7
ppid = 2712, pid = 2713, i = 8
ppid = 2713, pid = 2714, i = 9
PID 2713: child 2714 exited with status 0x0A00
PID 2712: child 2713 exited with status 0x0900
PID 2711: child 2712 exited with status 0x0800
PID 2710: child 2711 exited with status 0x0700
PID 2709: child 2710 exited with status 0x0600
PID 2708: child 2709 exited with status 0x0500
PID 2707: child 2708 exited with status 0x0400
PID 2706: child 2707 exited with status 0x0300
PID 2705: child 2706 exited with status 0x0200
PID 2704: child 2705 exited with status 0x0100
$