测试环境: 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,同时自己的程序执行完后自行退出。因此,当父进程先结束的情况下,子进程照样执行。
源代码:
- #include "apue.h"
- int glob = 6; /* external variable in initialized data */
- char buf[] = "a write to stdout/n";
- void getProcessInformation();
- int
- main(void)
- {
- int var; /* automatic variable on the stack */
- pid_t pid;
- var = 88;
- std::cout << "system status information:" << endl;
- getProcessInformation();
- if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)
- {
- std::cout << "write error!" << endl;
- }
- printf("before fork/n"); /* we don't flush stdout */
- if ((pid = fork()) < 0)
- {
- std::cout << "fork error" << endl;
- }
- else if (pid == 0)
- {
- std::cout << "child process information:" << endl;
- getProcessInformation();
- glob++; /* modify variables */
- var++;
- //exit(0);
- for(int i = 0; i < 100; i++)
- {
- std::cout << "child process, i: " << i << " pid: " << getpid() << endl;
- sleep(1);
- }
- exit(0);
- } else
- {
- //sleep(2); /* parent */
- std::cout << "parent process information:" << endl;
- getProcessInformation();
- exit(0);
- }
- std::cout << "end this application:" << endl;
- getProcessInformation();
- printf("pid = %d, glob = %d, var = %d/n", getpid(), glob, var);
- exit(0);
- }
- void getProcessInformation()
- {
- std::cout << "current process information:" << endl;
- std::cout << "pid: " << getpid() << endl;
- std::cout << "parent pid: " << getppid() << endl;
- std::cout << "user id: " << getuid() << endl;
- std::cout << "valid user id: " << geteuid() << endl;
- std::cout << "group id: " << getgid() << endl;
- std::cout << "valid group id: " << getegid() << endl;
- std::cout << "end/n/n" << endl;
- return;
- }