c fork,exec,getpid问题

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

#include  #include  #include  #include  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()的工作吗?

请帮助这位新手。

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

 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个过程和主要过程

您的代码多次调用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然后回答具体问题,如果在联机页面中有些内容仍然不清楚。

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

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