for的父子进程关系

来源:互联网 发布:gta5优化设置 编辑:程序博客网 时间:2024/04/25 07:13

 

测试环境: suse Linux

 

目标:查看父子进程关系

 

步骤:

编译、执行

 

测试结果:

system status information:
current process information:
pid: 30642
parent pid: 29390
user id: 73561
valid user id: 73561
group id: 16342
valid group id: 16342
end


a write to stdout
before fork
parent process information:
current process information:
pid: 30642
parent pid: 29390
user id: 73561
valid user id: 73561
group id: 16342
valid group id: 16342
end


before fork
child process information:
current process information:
pid: 30643
parent pid: 1
user id: 73561
valid user id: 73561
group id: 16342
valid group id: 16342
end


child process, i: 0 pid: 30643
child process, i: 1 pid: 30643
child process, i: 2 pid: 30643
child process, i: 3 pid: 30643
child process, i: 4 pid: 30643
child process, i: 5 pid: 30643
child process, i: 6 pid: 30643
child process, i: 7 pid: 30643
child process, i: 8 pid: 30643
child process, i: 9 pid: 30643
child process, i: 10 pid: 30643
child process, i: 11 pid: 30643
child process, i: 12 pid: 30643
child process, i: 13 pid: 30643
child process, i: 14 pid: 30643
child process, i: 15 pid: 30643
child process, i: 16 pid: 30643
child process, i: 17 pid: 30643
child process, i: 18 pid: 30643
child process, i: 19 pid: 30643
child process, i: 20 pid: 30643
child process, i: 21 pid: 30643
child process, i: 22 pid: 30643
child process, i: 23 pid: 30643
child process, i: 24 pid: 30643
child process, i: 25 pid: 30643
child process, i: 26 pid: 30643
child process, i: 27 pid: 30643
child process, i: 28 pid: 30643
child process, i: 29 pid: 30643
child process, i: 30 pid: 30643
child process, i: 31 pid: 30643
child process, i: 32 pid: 30643
child process, i: 33 pid: 30643
child process, i: 34 pid: 30643
child process, i: 35 pid: 30643
child process, i: 36 pid: 30643
child process, i: 37 pid: 30643
child process, i: 38 pid: 30643
child process, i: 39 pid: 30643
child process, i: 40 pid: 30643
child process, i: 41 pid: 30643
child process, i: 42 pid: 30643
child process, i: 43 pid: 30643
child process, i: 44 pid: 30643
child process, i: 45 pid: 30643
child process, i: 46 pid: 30643
child process, i: 47 pid: 30643
child process, i: 48 pid: 30643
child process, i: 49 pid: 30643
child process, i: 50 pid: 30643
child process, i: 51 pid: 30643
child process, i: 52 pid: 30643
child process, i: 53 pid: 30643
child process, i: 54 pid: 30643
child process, i: 55 pid: 30643
child process, i: 56 pid: 30643
child process, i: 57 pid: 30643
child process, i: 58 pid: 30643
child process, i: 59 pid: 30643
child process, i: 60 pid: 30643
child process, i: 61 pid: 30643
child process, i: 62 pid: 30643
child process, i: 63 pid: 30643
child process, i: 64 pid: 30643
child process, i: 65 pid: 30643
child process, i: 66 pid: 30643
child process, i: 67 pid: 30643
child process, i: 68 pid: 30643
child process, i: 69 pid: 30643
child process, i: 70 pid: 30643
child process, i: 71 pid: 30643
child process, i: 72 pid: 30643
child process, i: 73 pid: 30643
child process, i: 74 pid: 30643
child process, i: 75 pid: 30643
child process, i: 76 pid: 30643
child process, i: 77 pid: 30643
child process, i: 78 pid: 30643
child process, i: 79 pid: 30643
child process, i: 80 pid: 30643
child process, i: 81 pid: 30643
child process, i: 82 pid: 30643
child process, i: 83 pid: 30643
child process, i: 84 pid: 30643
child process, i: 85 pid: 30643
child process, i: 86 pid: 30643
child process, i: 87 pid: 30643
child process, i: 88 pid: 30643
child process, i: 89 pid: 30643
child process, i: 90 pid: 30643
child process, i: 91 pid: 30643
child process, i: 92 pid: 30643
child process, i: 93 pid: 30643
child process, i: 94 pid: 30643
child process, i: 95 pid: 30643
child process, i: 96 pid: 30643
child process, i: 97 pid: 30643
child process, i: 98 pid: 30643
child process, i: 99 pid: 30643

 

结论:

进程fork出来后,各自相互执行、抢占cpu,同时自己的程序执行完后自行退出。因此,当父进程先结束的情况下,子进程照样执行。

 

源代码:

 

 

  1. #include "apue.h"
  2. int     glob = 6;        /* external variable in initialized data */
  3. char    buf[] = "a write to stdout/n";
  4. void getProcessInformation();
  5. int
  6. main(void)
  7. {
  8.     int        var;        /* automatic variable on the stack */
  9.     pid_t    pid;
  10.     var = 88;
  11.     
  12.     std::cout << "system status information:" << endl;
  13.     getProcessInformation();
  14.     
  15.     if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)
  16.     {
  17.         std::cout << "write error!" << endl;
  18.     }
  19.     
  20.     printf("before fork/n");    /* we don't flush stdout */
  21.     if ((pid = fork()) < 0) 
  22.     {
  23.         std::cout << "fork error" << endl;
  24.     }
  25.     else if (pid == 0) 
  26.     {
  27.         std::cout << "child process information:" << endl;
  28.         getProcessInformation();
  29.         glob++;                    /* modify variables */
  30.         var++;
  31.         //exit(0);
  32.         
  33.         for(int i = 0; i < 100; i++)
  34.         {
  35.             std::cout << "child process, i: " << i << " pid: " << getpid() << endl;
  36.             sleep(1);
  37.         }
  38.         
  39.         exit(0);
  40.     } else 
  41.     {
  42.         //sleep(2);                /* parent */
  43.         std::cout << "parent process information:" << endl;
  44.         getProcessInformation();
  45.         exit(0);
  46.     }
  47.     std::cout << "end this application:" << endl;
  48.     getProcessInformation();
  49.     printf("pid = %d, glob = %d, var = %d/n", getpid(), glob, var);
  50.     
  51.     exit(0);
  52. }
  53. void getProcessInformation()
  54. {
  55.     std::cout << "current process information:" << endl;
  56.     std::cout << "pid: " << getpid() << endl;
  57.     std::cout << "parent pid: " << getppid() << endl;
  58.     std::cout << "user id: " << getuid() << endl;
  59.     std::cout << "valid user id: " << geteuid() << endl;
  60.     std::cout << "group id: " << getgid() << endl;
  61.     std::cout << "valid group id: " << getegid() << endl;
  62.     std::cout << "end/n/n" << endl;
  63.     
  64.     return;
  65. }