我正在尝试创建一个使用fork()来创建新进程的程序。示例输出应如下所示:
这是子进程。我的pid是733,我父母的id是772 这是父进程。我的pid是772,我孩子的身份是773。
这就是我编写程序的方式:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), fork());
return 0;
}
这导致输出:
这是子进程。我的pid是22163,我父母的id是0 这是子进程。我的pid是22162,我父母的id是22163。
为什么要两次打印语句?如何在第一句中显示子ID后如何正确显示父语句?
编辑:
#include <stdio.h>
#include <stdlib.h>
int main() {
int pid = fork();
if (pid == 0) {
printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), getppid());
}
else {
printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), pid);
}
return 0;
}
答案 0 :(得分:12)
首先阅读fork man page以及getppid / getpid手册页。
来自fork的
成功时,子进程的PID将在父进程中返回 执行的线程,并在子的线程中返回0 执行。失败时,将在父级的上下文中返回-1, 将不会创建子进程,并且将正确设置errno。
所以这应该是
的内容if ((pid=fork())==0){
printf("yada yada %u and yada yada %u",getpid(),getppid());
}
else{ /* avoids error checking*/
printf("Dont yada yada me, im your parent with pid %u ", getpid());
}
关于你的问题:
这是子进程。我的pid是22163,我父母的id是0。
这是子进程。我的pid是22162,我父母的身份是 22163
fork()
在printf
之前执行。因此,当它完成时,您有两个具有相同指令的进程。因此,printf将执行两次。对fork()
的调用会将0
返回给子进程,子进程的pid
将返回到父进程。
您将获得两个正在运行的进程,每个进程将执行此指令语句:
printf ("... My pid is %d and my parent's id is %d",getpid(),0);
和
printf ("... My pid is %d and my parent's id is %d",getpid(),22163);
〜
要将其包起来,上面的行是孩子,指定其pid
。第二行是父进程,指定其id(22162)及其子(22163)。
答案 1 :(得分:2)
它正在打印语句两次,因为它正在为父项和子项打印它。父级的父ID为0
尝试这样的事情:
pid_t pid;
pid = fork();
if (pid == 0)
printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(),getppid());
else
printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), getppid() );
答案 2 :(得分:1)
我们通过if,else语句控制fork()进程调用。请参阅下面的代码:
int main()
{
int forkresult, parent_ID;
forkresult=fork();
if(forkresult !=0 )
{
printf(" I am the parent my ID is = %d" , getpid());
printf(" and my child ID is = %d\n" , forkresult);
}
parent_ID = getpid();
if(forkresult ==0)
printf(" I am the child ID is = %d",getpid());
else
printf(" and my parent ID is = %d", parent_ID);
}
答案 3 :(得分:0)
它打印两次是因为你正在调用printf两次,一次是在你的程序执行中,一次是在fork中。尝试从printf调用中取出fork()。
答案 4 :(得分:0)
这是获取正确输出的正确方法....但是,childs parent id有时可能打印为1,因为父进程终止,而pid = 1的根进程控制此孤立进程。
pid_t pid;
pid = fork();
if (pid == 0)
printf("This is the child process. My pid is %d and my parent's id
is %d.\n", getpid(), getppid());
else
printf("This is the parent process. My pid is %d and my parent's
id is %d.\n", getpid(), pid);