2012-11-14 96 views
3

我试过实现一个os程序。下面是代码:执行if/else if/else与fork()

#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

'如果'和'else'将在父母和子女的背景下执行 –

+2

如果你不懂fork(),我是唯一一个在思考“实现os程序”的智慧的人吗? – Vicky

回答

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 ifelse你不打算进入的代码,的另一分支在一个进程的执行。您看到else ifelse,因为您有两个进程在运行。

注意pid1的有何不同,因为getpid()将返回哪些进程正在运行的代码,你可以看到你有两个不同的过程,一个采else if其他采else

+0

谢谢:)!一个非常好的解释.......我已经完全理解了这个 –

+0

@POOJAGUPTA - 高兴地帮忙! – Mike

2

有两个不同的进程正在运行你的程序。在fork的呼叫之后,执行了以下两条指令,它们具有不同的值pid。因此,else ifelse部分均通过两个进程中的一个执行。

3

man fork

叉实际上返回zero子进程ID和non-zero父意味着孩子的实际进程ID返回给父

else if(pid ==0) {...}后子进程

else {...}是父进程。

fork的基本含义是创建新进程。

如果主要调用一个fork()那么只有孩​​子是用它自己的地址空间创建的。就在fork调用的下面,父进程和子进程的所有语句都是相同的。

用叉子创建进程意味着这两个parentchild是独立的过程中,默认情况下

但在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{..}的第一条语句 这意味着父母将等到孩子终止。

3

fork()创建一个新的进程,它具有独立于原始进程的执行。

您的新子进程运行else if部件。

您现有的父进程运行else部分。

您的子进程和父进程之间的执行顺序不确定,它们现在是不同的进程,操作系统会安排它们运行,但内核感觉像。无论父进程还是子进程首先运行其代码,它都可能是随机的。

你甚至可以从子和父交错的printfs。