我是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;
}
该计划的结果如下:
创建子进程
这是儿童过程的试验
创建子进程
这是儿童过程的试验
现在我的问题如下:
exec()
函数有什么作用?任何人都可以向我解释exec()
,fork()
,getpid()
的源代码工作情况吗? 请帮助这位新手。
答案 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个过程和主过程