快速业务通道

LINUX进程控制(2)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-18

  3. 进程控制与终止

  3.1. 进程的控制

  一个进程创建子进程后,如果子进程先退出,系统不会自动清理掉子进程的环境,而由父进程调用wait或waitpid函数来完成清理工作,如果父进程不做清理工作,则已经退出的子进程将成为僵尸进程(defunct),在系统中如果存在的僵尸进程过多,将会影响系统的性能,对僵尸进程进行处理.

  另一种情况,如果父进程先于子进程退出,则子进程成为孤儿进程,孤儿进程退出后,它的清理工作有祖先进程init自动处理.

  函数原型:

  #include <sys/types.h>

  #include <sys/wait.h>

  pid_t wait(int *status);

  pid_t waitpid(pid_t pid, int *status, int options);

  wait和waitpid都等待一个已经退出的子进程,并进行清理工作;

  wait函数随机地等待一个已经退出的子进程,并返回该子进程的pid;

  waitpid等待指定pid的子进程;

  status参数是传出参数,存放子进程的退出代码;

  options的可选项有2个:WNOHANG和WUNTRACED,两参数可用|合成.WNOHANG表示无论子进程是否退出都将立即返回,WUNTRACED极少使用.

  示例:

  //{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{

  #include <stdio.h>

  #include <stdlib.h>

  #include <unistd.h>

  #include <sys/types.h>

  #include <sys/wait.h>

  #include <signal.h>

  void SignChildPsExit(int iSignNo)

  {

  pid_t pid;

  int iExitCode;

  pid=wait(&iExitCode);

  printf("SignNo:%d child %d exit\n",iSignNo,pid);

  }

  int main()

  {

  signal(SIGCHLD,SignChildPsExit);

  printf("Parent process id:%d\n",getpid());

  pid_t iRet=fork();

  if(iRet<0){

  printf("Create child process fail!\n");

  return -1;

  }

  //}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

  3.2. 进程的终止

  进程的终止有5种方式:

  main函数的自然返回; 拥有帝国一切,皆有可能。欢迎访问phome.net

  调用exit函数

  调用_exit函数

  调用abort函数

  接收到能导致进程终止的信号

  前3种方式为正常的终止,后2种为非正常终止.但是无论哪种方式,进程终止时都将执行相同的关闭打开的文件,释放占用的内存等资源.只是后两种终止会导致程序有些代码不会正常的执行,比如对象的析构、atexit函数的执行等.

  kill函数

  原型为:

  #include <sys/types.h>

  #include <signal.h>

  int kill(pid_t pid, int sig);

  kill函数给进程pid发送信号sig,可发送的信号可以通过shell命令kill -l查看,接收信号的进程如果不对信号进行处理,将会被自动终止.

  4. 进程间打开文件的继承

  4.1. 用fork继承打开的文件

  fork以后的子进程自动继承了父进程的打开的文件,继承以后,父进程关闭调打开的文件不会对子进程造成影响.

  示例:

  #include <stdio.h>

  #include <fcntl.h>

  #include <unistd.h>

  #include <sys/types.h>

  #include <sys/stat.h>

  int main()

  {

  char szBuf[32]={0};

  int iFile=open("./a.txt",O_RDONLY);

  if(fork()>0){//parent process

  close(iFile);

  return 0;

  }

  //child process

  sleep(3);//wait for parent process closing fd

  if(read(iFile,szBuf,sizeof(szBuf)-1)<1){

  perror("read fail");

  }else{

  printf("string:%s\n"

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号