1 进程控制
- fork 函数
新创建的子进程从fork函数下继续执行,子进程的fork返回值为0,表示创建子进程成功;父进程的fork函数返回值返回的是子进程的pid值。- 创建一个进程,参考代码:
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(void) { pid_t pid; printf("xxxxx\n"); pid = fork(); if(pid == -1) { perror("fork error!"); exit(1); }else if(pid == 0) { printf("I' am child, pid = %u\n, ppid = %u\n", getpid(), getppid()); }else if(pid > 0) { printf("I' am father, pid = %u\n, ppid = %u\n", getpid(), getppid()); sleep(1); } printf("YYYYYYY\n"); return 0; }
运行结果:
留待问题:当没有sleep(1)时,输出其实是:
循环创建五个进程代码问题:
三个pid的示例般:
故循环创建5个子进程的参考代码:#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(void) { int i; pid_t pid; printf("xxxxx\n"); for(i=0; i<5; i++) { pid = fork(); if(pid == -1) { perror("fork error!"); exit(1); }else if(pid == 0) { printf("I' am child, pid = %u\n, ppid = %u\n", getpid(), getppid()); break; // if this is a child pid then step out 'for' }else if(pid > 0) { printf("I' am father, pid = %u\n, ppid = %u\n", getpid(), getppid()); sleep(1); } } printf("YYYYYYY\n"); return 0; }
运行结果:
(Ps:程序在执行时,由于是指令的形式,故实际的计算机系统中运行的这段for循环,看似是子进程一一创建的,其实在计算机中是同时创建的。故创建的那一时刻是5个子进程和父进程同时抢夺cpu资源。书《advanced programming unix environment》中有一个结论,尽管是同时抢夺cpu资源,可是父进程抢到的可能性更大。但理论上同时抢时,即谁都有可能抢到。)
- 创建一个进程,参考代码:
- getuid函数
打个比方:sudo apt-get install 时,有效用户是root,实际用户是当前环境下的。 - getgid函数
2 进程共享
ps:文件描述符就是那一个指针,故在程序未分叉前有一个文件描述符时,程序分叉后,由于是同一个指针,故父子进程共享它。这和多个进程拥有同一个文件描述符时,指向的是同一个文件 是一个道理。