歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 《APUE》:創建一個孤兒進程組

《APUE》:創建一個孤兒進程組

日期:2017/3/1 10:11:32   编辑:Linux編程

《Unix環境高級編程》這本書附帶了許多短小精美的小程序,我在閱讀此書的時候,將書上的代碼按照自己的理解重寫了一遍(大部分是抄書上的),加深一下自己的理解(純看書太困了,呵呵)。此例子在Ubuntu 10.04上測試通過。

相關鏈接

  • 《UNIX環境高級編程》(第二版)apue.h的錯誤 http://www.linuxidc.com/Linux/2011-04/34662.htm
  • Unix環境高級編程 源代碼地址 http://www.linuxidc.com/Linux/2011-04/34826.htm
  1. //《APUE》程序9-1:創建一個孤兒進程組
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <errno.h>
  5. #include <signal.h>
  6. #include <stdlib.h>
  7. //輸出錯誤信息並退出
  8. void error_quit(const char *str)
  9. {
  10. fprintf(stderr, "%s\n", str);
  11. exit(1);
  12. }
  13. //處理SIGHUP信號
  14. static void sig_hup(int signo)
  15. {
  16. printf("SIGHUP received, pid = %d\n", getpid());
  17. }
  18. static void pr_ids(char *name)
  19. {
  20. printf("%s: pid = %d, ppid = %d, pgrp = %d, tpgrp = %d\n",
  21. name, getpid(), getppid(), getpgid(), tcgetpgrp(STDIN_FILENO));
  22. fflush(stdout);
  23. }
  24. int main()
  25. {
  26. char c;
  27. pid_t pid;
  28. pr_ids("parent");
  29. pid = fork();
  30. if( pid < 0 )
  31. error_quit("fork error");
  32. else if( pid > 0 )
  33. {
  34. sleep(5);
  35. return 0;
  36. }
  37. else
  38. {
  39. pr_ids("child");
  40. signal(SIGHUP, sig_hup);
  41. kill(getpid(), SIGTSTP);
  42. pr_ids("child");
  43. //這裡和書上說的不同,read函數能正常運行,不會發生錯誤(Ubuntu10.04)
  44. int temp = read(STDIN_FILENO, &c, 1);
  45. if( temp != 1 )
  46. {
  47. printf("read error from controlling TTY, "
  48. "errno = %d\n", errno);
  49. }
  50. return 0;
  51. }
  52. }

運行示例(紅色字體的為輸入):

www.linuxidc.com @ubuntu:~/code$ gcc temp.c -o temp
www.linuxidc.com @ubuntu:~/code$ ./temp
parent: pid = 3311, ppid = 3241, pgrp = 3311, tpgrp = 3311
child: pid = 3312, ppid = 3311, pgrp = 3311, tpgrp = 3311
SIGHUP received, pid = 3312
child: pid = 3312, ppid = 1, pgrp = 3311, tpgrp = 3311

程序說明:

1:首先讓父進程休眠5秒鐘,讓子進程在父進程終止之前運行。
2:子進程為SIGHUP信號建立信號處理程序,用於觀察SIGHUP信號是否已經發送到子進程。
3:子進程用kill函數向自身發送SIGTSTP信號,模擬用終端停止一個前台作業。
4:父進程終止時,該子進程成為了一個孤兒進程,ppid=1。
5:現在,子進程成為一個孤兒進程組的成員。
6:父進程停止後,進程組成為了孤兒進程組,父進程會向新的孤兒進程組中處於停止狀態的每個進程發送SIGHUP信號,接著又向其發送SIGCONT信號。
7:在處理了SIGHUP信號之後,子進程繼續。對SIGHUP信號的默認動作是終止該進程,所以必須提供一個信號處理程序以捕捉該信號。

Copyright © Linux教程網 All Rights Reserved