fork()函数
目标:熟悉fork创建一个和多个子进程子线程
函数原型:pid_t fork(void);
返回值:成功返回:① 父进程返回子进程的ID(非负) ②子进程返回 0 ;
失败返回-1。
注意:pid_t类型表示进程ID,它是有符号整型。
例程一:创建一个子线程
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 int main(void) 5 { 6 pid_t pid; 7 pid = fork();//创建子进程 8 //调用出错 9 if(pid == -1){ 10 printf("fork failed "); 11 return 1; 12 } 13 else if(pid){ //返回值大于0,为父进程 14 printf("The father return value is %d ",pid); 15 printf("The father pid is %d ",getpid()); 16 printf("The father ppid is %d ",getppid()); 17 sleep(2); 18 } 19 else{ //返回值等于0,为子进程 20 printf("The child return value is %d ",pid); 21 printf("The child pid is %d ",getpid()); 22 printf("The child ppid is %d ",getppid()); 23 } 24 return 0; 25 }
编译执行结果:
例程二:循环创建多个子线程
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 5 int main(void) 6 { 7 int i; 8 pid_t pid; 9 for (i = 0; i < 5; i++) { 10 pid = fork(); 11 if (pid == 0) { //若为子进程则直接break退出 12 break; 13 } 14 } 15 16 if (i < 5) { //子进程部分 18 sleep(i); 19 printf("I'am %d child , pid = %u ", i+1, getpid()); 20 21 } else { //父进程 22 sleep(i); 23 printf("I'm parent "); 24 } 25 return 0; 26 }
编译执行结果:
其中,getpid()函数: 获取当前进程ID,原型为pid_t getpid(void);
getppid()函数:获取当前进程的父进程ID,原型为pid_t getppid(void);