我尝试过实施一个os程序。这是代码:
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t pid, pid1;
pid = fork();
if(pid<0)
{
fprintf(stderr,"Fork Failed");
return 1;
}
else if(pid == 0) /* child process */
{
pid1 = getpid();
printf("child: pid = %d\n",pid);
printf("child: pid1 = %d\n",pid1);
}
else /* parent process */
{
pid1 = getpid();
printf("parent: pid = %d\n",pid);
printf("parent: pid1 = %d\n",pid1);
}
return 0;
}
及其o / p:
parent: pid = 1836
parent: pid1 = 1835
child: pid = 0
child: pid1 = 1836
有人可以解释一下它是如何工作的,即代码中编写的if
/ else-if
/ else
语句的执行顺序。我认为一旦else if
条件成立,那么else
部分就不会被执行,但是在这里它执行了父进程部分,即else
部分,然后是子部分......怎么来的?
答案 0 :(得分:5)
您应该阅读fork()。一旦你点击了一个fork()
语句,就会启动第二个进程,它有一个父进程拥有的所有东西的副本,但它可以运行一个单独的执行,它从fork
看到的返回不同于父母看到了。
int main()
{
pid_t pid, pid1;
<--- up to here you have one process running
pid = fork(); <--- when this returns you have two processes:
parent has pid = child's pid child has pid = 0
if(pid<0) <--- child and parent both check this, it's not true so they move on
{
....
}
else if(pid == 0)<--- this is true for the child, not the parent
{
.... <--- child will now execute this code
}
else <-- nothing else was true for the parent so it sees this
.... <-- and executes this code
是的,你是对的,一旦你点击if
,或else if
或else
你不会进入代码的另一个分支,在单个流程中执行。您看到了else if
和else
,因为您正在运行两个进程。
注意pid1
是如何不同的,因为getpid()
正在返回正在运行该代码的进程,并且您可以看到有两个不同的进程,一个选择else if
其他人选择else
。
答案 1 :(得分:3)
执行man fork
fork实际为子进程id返回zero
,而父进程为non-zero
表示将child的实际进程id返回给父进程
else if(pid ==0 ) {...}
是子进程后的
和else {...}
是父流程。
fork的基本含义是创建新进程。
如果main调用一个fork()
,则仅使用自己的地址空间创建子项。在fork调用之下,父进程和子进程的所有语句都是相同的。
使用fork创建进程意味着这两个parent
和child
是独立进程,默认情况下不会在它们之间共享任何数据
但是在你的情况下,在fork调用之后这两个是独立的,所以这两个进程的执行顺序是未指定的。 你可能会得到这些东西:
1. parent executed and program terminates
parent: pid = 1235
parent: pid1 = 1234
2. child executed then parent and then program terminates :
child : pid = 0
child :pid1 = 1235
parent : pid = 1235
parent :pid1 = 1234
如果你想确保孩子必须先执行然后父shloud退出。
在父代码wait(NULL);
中添加一行作为else{..}
中的第一个语句
这意味着父母将等到孩子终止。
答案 2 :(得分:3)
fork()创建一个新进程,它可以独立于原始进程执行。
您的新子流程会运行else if
部分。
您现有的父流程会运行else
部分。
您的子进程和父进程之间的执行顺序不是确定的,它们现在是不同的进程,操作系统将安排它们运行,但内核感觉如此。父进程或子进程是否首先运行其代码可能或多或少是随机的。
你甚至可以让孩子和父母的printfs交错。
答案 3 :(得分:2)
运行程序有两个不同的进程。在fork
调用之后,以下指令有两次执行,它们具有不同的pid
值。因此,else if
和else
部分都由两个进程中的一个执行。