【问题标题】:Why does my forking program double in size after each fork?为什么我的分叉程序在每次分叉后都会翻倍?
【发布时间】:2017-03-15 09:47:52
【问题描述】:

所以我只想创建一个简单的分叉程序,以每半秒 1 个的速度分叉 5 个孩子,然后显示每个分叉完成的日期和时间。这就是代码的要点

int count = 1;
while(count <= 5){
    int kid = fork();

    if(kid == -1){
        perror("error in fork");
        exit(0);
    } else if(!kid){
        numbytes = read(sockfd, buf, sizeof(buf)-1);
        buf[numbytes] = '\0';
        printf("%s\n",buf);
    }
    count++;
    usleep(500000); //create per every half second, 500000 = 0.5sec
    close(sockfd);

}


return 0;

}

我认为这应该足够简单,但不是分叉 5 次,而是在每次分叉后加倍.. 所以它分叉 1 次,然后是 2,然后是 4、8 .. 等等。

帮助?

【问题讨论】:

  • 因为你一直在父进程中分叉 子进程。子进程是否应该在完成后退出
  • 另外,你真的应该为子进程wait,否则当父进程退出时,你将拥有成为孤立的僵尸进程。
  • @Someprogrammerdude 感谢您的快速回复,但现在我无法找出等待和退出的位置。抱歉,这对我来说很新。
  • 和块末尾的 exit() 之后? @Karthikeyan.R.S
  • Apologize @Jeans ,您应该在 else if 块中添加 exit 并在 usleep 之前或之后添加 wait

标签: c unix fork


【解决方案1】:

fork 一般就是这种形式。

    int pid = fork();

    if( pid == -1 ) { /* error */
        fprintf(stderr, "Error forking: %s", strerror(errno));
        exit(1);
    }
    else if( pid == 0 ) { /* child */
        puts("Child");
        exit(0);
    }

    /* Parent */
    printf("Forked %d\n", pid);

请注意,孩子必须退出,否则它将继续执行程序的其余部分。通常你让子进程运行一个函数并退出。

另一部分是主程序应该wait,直到所有子进程都完成,否则你得到zombies。通常是一个循环调用wait(),直到没有更多的孩子。

int wpid;
int wstatus;
while( (wpid = wait(&wstatus)) != -1 ) {
    printf("Child %d exited with status %d\n", wpid, wstatus);
}

把它们放在一起,这就是你如何分叉并等待 5 个子进程的方法。

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

int main() {
    int max_children = 5;

    for( int i = 0; i < max_children; i++ ) {
        int pid = fork();

        if( pid == -1 ) { /* error */
            fprintf(stderr, "Error forking: %s", strerror(errno));
        }
        else if( pid == 0 ) { /* child */
            puts("Child");
            exit(0);
        }

        /* Parent */
        printf("Forked %d\n", pid);
    }

    int wpid;
    int wstatus;
    while( (wpid = wait(&wstatus)) != -1 ) {
        printf("Child %d exited with status %d\n", wpid, wstatus);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2021-06-12
    • 2012-09-18
    • 2021-05-30
    • 1970-01-01
    • 2018-09-24
    • 2015-11-26
    相关资源
    最近更新 更多