c fork,exec,getpid problem

旧时模样 提交于 2019-12-11 16:53:56

问题


I'm new to c language and Linux. I have a problem related to fork(),getpid()and exec()function. I wrote a c program using fork() call the code of my program is following" code:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

void fun()
{
  printf("\n this is trial for child process");
}

int main (int argc, char const *argv[])
{
  int i,status,pid,t;

  if(pid=fork()<0)
  { 
    printf("\nfailed to create the process\n");
  }
  if(pid=fork()==0)
  {
    printf("\n the child process is created");
    fun();
    exit(1);
  }
  while(wait(&status)!=pid);
  return 0;
}

The out put of this program is following:

the child process is created

this is trial for child process

the child process is created

this is trial for child process

Now my questions are as follows:

  1. Why the output of program showing same thing twice? The output supposed to be "child process is created this is trial for child process"
  2. Why the output is not according to code ?
  3. Can we have a program which has 4 processes and all the processes perform different task for example one process print "my name". One process print "my age", the other process print "my address ?
  4. How to make multiple process in main function ?
  5. How to control the execution of multiple process ?
  6. what does the exec() function do? Can anyone please explain me the working of exec(), fork(), getpid() with a source code?

Please help this novice fellow.


回答1:


In this code you are creating Three process not including your main process.

pid=fork()

is itself a statement , which forks a new process even though it is inside an if statement condition. After the first fork() call the remaining codes will be executed twice. so next fork call will be called twice. You have already created a new process.

fork returns zero to itself and its process id to its parent

That is consider a process A forks B (not from your code)

 pid = fork();
 printf("pid is : %d",pid);

printf statement executes twice(one for A and one for B). For A it prints(A is parent)

pid is : 512 //some integer value process id

and B prints

pid is : 0

So in your question

 if(pid=fork()==0)
  {
    printf("\n the child process is created");
    fun();
    exit(1);
  }

this is the second fork which is already executing twice. So each of this execution creates a new child process. For both childs pid value is 0. So your print statement executes, which is what you see in the output. But for both parents a pid value will be there and your if condition fails, so it wont print. These two childs are your second and third processes..So in short you create 3 processes along with the main process




回答2:


Your code calls fork() multiple times:

if(pid=fork()<0) /* calls fork() */
{ 
   ...
}
if(pid=fork()==0) /* also calls fork() */
{
   ...
}

Each successful fork() creates a new child process. To make matters worse, the second fork() is called by both the parent and the first child.

If you're trying to create a single child process, you should call fork() just once:

pid_t pid; /* note the correct return type of fork() */
...
pid = fork();
if (pid < 0)
{ 
   ...
}
else if (pid == 0)
{ 
   ...
}

If you want to create multiple child processes, you can have the parent process call fork() in a loop.

As to questions like "what does exec do?", my advice is to learn how to use man and then come back with specific questions if there's something in the manpages that remains unclear.




回答3:


The output is generated twice because you are forking twice:

if(pid=fork()<0)  // Fork #1
{ 
   printf("\nfailed to create the process\n");
}
if(pid=fork()==0) // Fork #2


来源:https://stackoverflow.com/questions/6199284/c-fork-exec-getpid-problem

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!