Why the output is printing twice?

2019-08-17 15:52发布

问题:

May be it look childish for most of you but I am unable to understand this small piece of code.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char** argv) {
    int i, pid;
    pid = fork();
    printf("Forking the pid: %d\n",pid);
    for(i =0; i<5; i++)
        printf("%d  %d\n", i,getpid());
    if(pid)
        wait(NULL);
    return (0);
}

Out put of this program is

Forking the pid: 2223
0  2221
1  2221
2  2221
3  2221
4  2221
Forking the pid: 0
0  2223
1  2223
2  2223
3  2223
4  2223
Press [Enter] to close the terminal ...

In the for loop the printf command is used once. Why "Forking the pid" and after that the pid's are printed twice. How this is working? Can anybody explain me this? Thanks in advance. Can anybody explain me why we have to use wait here? What I understood from the man pages is wait retuns the control to parent process? Is what I understood is correct?Is it necessary to use wait after forking a process? Operating system : ubuntu, compiler : gcc, IDE : netbeans

回答1:

But that' exactly what fork does. You forked the process and everything after the fork is done twice because now you have two processes executing the same printing code. You are basically asking why fork forks. fork forks because is is supposed to fork. That's what it's for.

After fork the parent and the child processes are generally executed in parallel, meaning that the nice sequential output you see in your example is not guaranteed. You might have easily ended up with line-interleaved output from two processes.

wait function in your case is executed from the parent process only. It makes it wait until the child process terminates, and only after that the parent process proceeds to terminate as well. Calling wait in this particular example is not really critical, since the program does nothing after that, it just terminates. But, for example, if you wanted to receive some feedback from the child process into the parent process and do some additional work on that feedback in the parent process, you'd have to use wait to wait for the child process to complete its execution.



回答2:

The fork() call makes a new process. The rest of the code is then executed from each of the 2 processes. (Man page)



回答3:

You're printing in both processes. Put your printing loop in an else clause of the if (pid):

pid = fork();
if(pid)
{
    printf("Child pid: %d\n",pid);
    wait(NULL);
}
else
{
    for(i =0; i<5; i++)
        printf("%d  %d\n", i,getpid());
}

You see, fork returns twice, once in the parent process and once in the child process. It returns 0 in the child and the pid of the created process in the parent.



回答4:

Because both the parent and child process are outputting their results.

See here: http://en.wikipedia.org/wiki/Fork_(operating_system)#Example_in_C for a good example.



回答5:

fork creates a new process, and returns in both the old process (the parent) and in the new process (the child).

You can tell which one you are in by looking at the return value from fork. In the parent process it returns the PID of the child process. In the child process it return 0.



标签: c fork wait