开发者

c fork,exec,getpid problem

开发者 https://www.devze.com 2023-03-10 02:57 出处:网络
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\"

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? Th开发者_JS百科e 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.


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.


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


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
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号