c fork,exec,getpid问题

时间:2011-06-01 09:50:43

标签: c fork systems-programming fork-join

我是c语言和Linux的新手。我有一个与fork(),getpid()和exec()函数有关的问题。 我用fork()编写了一个c程序,调用我程序的代码如下“ 代码:

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

该计划的结果如下:

  

创建子进程

     

这是儿童过程的试验

     

创建子进程

     

这是儿童过程的试验

现在我的问题如下:

  1. 为什么程序的输出显示两次同样的事情?输出应该是“子过程被创建这是儿童过程的试验”
  2. 为什么输出不符合代码?
  3. 我们可以拥有一个程序,它有4个进程,所有进程执行不同的任务,例如一个进程打印“我的名字”。一个流程打印“我的年龄”,另一个流程打印“我的地址?
  4. 如何在主要功能中进行多个处理?
  5. 如何控制多个流程的执行?
  6. exec()函数有什么作用?任何人都可以向我解释exec()fork()getpid()的源代码工作情况吗?
  7. 请帮助这位新手。

3 个答案:

答案 0 :(得分:1)

您的代码多次调用fork()

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

每个成功的fork()都会创建一个新的子进程。更糟糕的是,父母和第一个孩子都会调用第二个fork()

如果您尝试创建单个子流程,则应该只调用fork()一次:

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

如果要创建多个子进程,可以让父进程在循环中调用fork()

对于诸如“exec做什么?”之类的问题,我的建议是学习如何使用man,然后回答具体问题,如果联机帮助页中的某些内容仍然不清楚。< / p>

答案 1 :(得分:0)

输出生成两次,因为您分叉两次:

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

答案 2 :(得分:0)

在此代码中,您创建了三个不包括主流程的流程。

pid=fork()

本身就是一个语句,即使它在if语句条件中,它也会分叉一个新进程。在第一次fork()调用之后,剩余的代码将被执行两次。所以下一次fork调用将被调用两次。您已经创建了一个新流程。

  

fork为自身及其返回零   将id发送到其父级

这是考虑进程A分叉B(不是来自您的代码)

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

printf语句执行两次(一次用于A,一次用于B)。对于A打印(A是父级)

  

pid是:512 //一些整数值   进程ID

和B打印

  

pid是:0

所以在你的问题中

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

这是第二个已经执行两次的fork。因此,每次执行都会创建一个新的子进程。对于这两个子节点,pid值为0.因此执行print语句,这是您在输出中看到的。但是对于父母双方都会有pid值,而你的if条件会失败,所以它不会打印出来。这两个孩子是你的第二个和第三个过程。简而言之,你创建了3个过程和主过程