为什么我的分叉程序在每个分叉后都会加倍?

时间:2016-11-02 06:44:21

标签: c unix fork

所以我只想创建一个简单的分叉程序,以每半秒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次......等等。

帮助?

1 个答案:

答案 0 :(得分:3)

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);
    }
}