LINUX学习记录-管道通讯和子程序处理-持续更新

子进程

#include <unistd.h>  
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
int p1,p2;
void main()
{ void ppdo();
  void p1do();
  void p2do();
  signal(SIGINT,ppdo);
  p1=fork();
  if(p1==0) {
    signal(SIGUSR1,p1do);
    for(;;);
  }
  else {
    p2=fork();
    if(p2==0) {
      signal(SIGUSR2,p2do);
      for(;;);
    }
  }
  wait(0);
  wait(0);
  printf("\nParent process is killed!\n");
  exit(0);
}
void ppdo()
{ kill(p1,SIGUSR1);
  kill(p2,SIGUSR2);
}
void p1do()
{ printf("\nChild process p1 is killed by parent!\n");
  exit(0);
}
void p2do()
{ printf("\nChild process p2 is killed by parent!\n");
  exit(0);
}

fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;

在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。

亦即意味着一旦开始fork之后,子进程就被创建(同时返回fork函数值),进入一个子进程(有独立的和父进程不一样的pid),运行完之后回到主进程。

猜你喜欢

转载自blog.csdn.net/zhubozhen/article/details/80547143