使用fork()执行if / else if / else

时间:2012-11-14 12:17:22

标签: c operating-system fork

我尝试过实施一个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部分,然后是子部分......怎么来的?

4 个答案:

答案 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 ifelse你不会进入代码的另一个分支,在单个流程中执行。您看到了else ifelse,因为您正在运行两个进程。

注意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创建进程意味着这两个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{..}中的第一个语句 这意味着父母将等到孩子终止。

答案 2 :(得分:3)

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

您的新子流程会运行else if部分。

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

您的子进程和父进程之间的执行顺序不是确定的,它们现在是不同的进程,操作系统将安排它们运行,但内核感觉如此。父进程或子进程是否首先运行其代码可能或多或少是随机的。

你甚至可以让孩子和父母的printfs交错。

答案 3 :(得分:2)

运行程序有两个不同的进程。在fork调用之后,以下指令有两次执行,它们具有不同的pid值。因此,else ifelse部分都由两个进程中的一个执行。

相关问题