Problem forking fork() multiple processes Unix

后端 未结 4 1118
走了就别回头了
走了就别回头了 2021-02-01 23:28

So I have this function that forks N number of child processes. However it seems to be forking more than specified. Can you tell me what I\'m doing wrong? Thanks



        
4条回答
  •  栀梦
    栀梦 (楼主)
    2021-02-02 00:02

    When you fork a process, you basically end up with two (almost) exact copies of the process and both of them will continue running.

    So what's happening is that the children themselves are continuing the loop in the own process space (after they print their output) as well as the parent doing it. And, in fact, because these children are also forking, the grandchildren will also carry on from that point. I'm sure there's a formula for actually figuring out how many children you end up with (probably something like N!) but I don't have the energy to figure it out at the moment. Better to use the following solution.

    The way to tell the difference between parent and child is the return value from fork.

    • If you get back a -1, you're the parent and the fork failed.
    • If you get back a zero, you're the child.
    • If you get back a positive number, you're the parent and that number is the child PID (so you can manipulate it or wait for it).

    Here's some test code:

    #include 
    #include 
    #include 
    
    void forkChildren (int nChildren) {
        int i;
        pid_t pid;
        for (i = 1; i <= nChildren; i++) {
            pid = fork();
            if (pid == -1) {
                /* error handling here, if needed */
                return;
            }
            if (pid == 0) {
                printf("I am a child: %d PID: %d\n",i, getpid());
                sleep (5);
                return;
            }
        }
    }
    
    int main (int argc, char *argv[]) {
        if (argc < 2) {
            forkChildren (2);
        } else {
            forkChildren (atoi (argv[1]));
        }
        return 0;
    }
    

    and some output to show you what's happening:

    pax> forktest 5
    I am a child: 1 PID: 4188
    I am a child: 2 PID: 4180
    I am a child: 3 PID: 5396
    I am a child: 4 PID: 4316
    I am a child: 5 PID: 4260
    
    pax> _
    

提交回复
热议问题