Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何创建unix进程二叉树?_C_Unix_Process_Fork - Fatal编程技术网

C 如何创建unix进程二叉树?

C 如何创建unix进程二叉树?,c,unix,process,fork,C,Unix,Process,Fork,有人能帮我吗,不一定要完成我的家庭作业 我需要使用fork()创建一个进程树;在Unix/C中,到目前为止,我能达到的第四个级别的最佳状态是我的代码: /* Includes */ #include <unistd.h> /* Symbolic Constants */ #include <stdio.h> /* Input/Output */ #include <stdlib.h> /* General Utilities */ int main() {

有人能帮我吗,不一定要完成我的家庭作业

我需要使用fork()创建一个进程树;在Unix/C中,到目前为止,我能达到的第四个级别的最佳状态是我的代码:

/* Includes */
#include <unistd.h> /* Symbolic Constants */
#include <stdio.h> /* Input/Output */
#include <stdlib.h> /* General Utilities */

int main()
{
    pid_t childpid;
    pid_t pid;
    int i;
    childpid=fork();
    waitpid();
    i=0;
    for (; i<1; i++) {
        int b=0;
        for (; b<1;b++) {
            childpid=fork();
            fprintf(stderr,"the value of i is %d, i am %ld , my parent is %ld\n",
                            i, (long)getpid(), (long)getppid());

            if (childpid==0) {
                break;
            }

        }
        if (childpid==0) {
            break;
        }
    }

    sleep(1);
}
该函数需要参数

初始值
childpid=fork()是意外的

你可以理智地写:

for (int i = 0; i < 1; i++)
示例源 源代码
#包括
#包括
#包括
#包括
内部主(空)
{
fprintf(stderr,“开始%d\n”,(int)getpid();
如果(fork()<0 | | fork()<0 | | fork()<0 | | fork()<0)
{
fprintf(stderr,“pid%d\n中的Fork故障,(int)getpid());
出口(1);
}
fprintf(stderr,“我是%d,我的父母是%d\n”,
(int)getpid(),(int)getppid();
while(等待(0)>0)
;
fprintf(stderr,“退出%d\n”,(int)getpid();
返回(0);
}

这是为了帮助您,我实际上不确定您的代码中发生了什么。它也不分叉的方式,我一直在寻找它和修改我尝试了失败:/谢谢!由于循环,第二次尝试更有意义。我真的能看到一切都是从哪里来的。在第一个示例中,究竟是什么保持了创建过程?这是最让人困惑的概念——是的,它让人困惑。这是一个有点奇怪的要求,是虐待狂式的教学人员为无辜的蠢货学生设计的。在给定的级别L∈ {0,1,2},有2^L个进程,每个进程派生2个子进程,这些子进程在L+1级别继续工作。然后,这些过程识别自己,等待孩子死亡,然后报告自己的死亡。
for (int i = 0; i < 1; i++)
Start 46480
i am 46480, my parent is 30775
i am 46482, my parent is 46480
i am 46481, my parent is 46480
i am 46483, my parent is 46481
i am 46484, my parent is 46482
i am 46486, my parent is 46482
i am 46487, my parent is 46483
Exit 46487
i am 46488, my parent is 46484
Exit 46488
i am 46485, my parent is 46481
i am 46491, my parent is 46484
Exit 46491
i am 46489, my parent is 46483
Exit 46489
Exit 46483
i am 46492, my parent is 46486
Exit 46492
Exit 46484
i am 46490, my parent is 46486
Exit 46490
i am 46493, my parent is 46485
Exit 46493
Exit 46486
Exit 46482
i am 46494, my parent is 46485
Exit 46494
Exit 46485
Exit 46481
Exit 46480
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>

static pid_t fork_ok(void)
{
    pid_t pid;
    if ((pid = fork()) < 0)
    {
        fprintf(stderr, "Fork failure in pid %d\n", (int)getpid());
        exit(1);
    }
    return pid;
}

int main(void)
{
    fprintf(stderr, "Start %d\n", (int)getpid());

    for (int level = 0; level < 3; level++)
    {
        if (fork_ok() == 0 || fork_ok() == 0)
            continue;
        break;
    }
    fprintf(stderr, "i am %d, my parent is %d\n",
            (int)getpid(), (int)getppid());
    while (wait(0) > 0)
        ;
    fprintf(stderr, "Exit %d\n", (int)getpid());
    return(0);
}
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>

static pid_t fork_ok(void)
{
    pid_t pid;
    if ((pid = fork()) < 0)
    {
        fprintf(stderr, "Fork failure in pid %d\n", (int)getpid());
        exit(1);
    }
    return pid;
}

static void new_level(int level)
{
    if (level > 3)
        return;
    if (fork_ok() == 0 || fork_ok() == 0)
        new_level(level+1);
    else
    {
        printf("i am %d, my parent is %d\n",
                (int)getpid(), (int)getppid());
        while (wait(0) > 0)
            ;
        printf("Exit %d\n", (int)getpid());
    }
}

int main(void)
{
    printf("Start %d\n", (int)getpid());
    fflush(0);
    new_level(0);
    return(0);
}
Start 44397
i am 44397, my parent is 30775
i am 44400, my parent is 44397
i am 44401, my parent is 44397
Exit 44401
i am 44399, my parent is 44397
i am 44398, my parent is 44397
i am 44404, my parent is 44400
Exit 44404
i am 44403, my parent is 44399
i am 44402, my parent is 44398
i am 44405, my parent is 44398
i am 44407, my parent is 44398
Exit 44407
Exit 44400
i am 44406, my parent is 44399
Exit 44406
i am 44408, my parent is 44402
i am 44410, my parent is 44402
i am 44411, my parent is 44405
Exit 44410
Exit 44411
i am 44409, my parent is 44403
Exit 44409
Exit 44405
i am 44412, my parent is 44408
Exit 44412
Exit 44403
Exit 44399
Exit 44408
Exit 44402
Exit 44398
Exit 44397
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>

int main(void)
{
    fprintf(stderr, "Start %d\n", (int)getpid());
    if (fork() < 0 || fork() < 0 || fork() < 0 || fork() < 0)
    {
        fprintf(stderr, "Fork failure in pid %d\n", (int)getpid());
        exit(1);
    }
    fprintf(stderr, "i am %d, my parent is %d\n",
            (int)getpid(), (int)getppid());
    while (wait(0) > 0)
        ;
    fprintf(stderr, "Exit %d\n", (int)getpid());
    return(0);
}