- fork函数调用成功后,会为子进程申请PCB和用户内存空间,exit退出进程时释放了用户空间的资源,但是没有释放PCB,释放PCB由父进程完成
- exit函数用于退出当前进程,return用于退出当前函数,所以在main函数中return(0)和exit(0)完成相同功能
exit函数有:exit(status)——执行清理函数,
_exit(status)——不调用任何注册函数而直接退出进程,
on_exit()atexit()——注册调用exit()前执行的操作函数
exit(status)
调用exit(status)时要调用一段终止处理程序,然后关闭所有I/O流
执行成功则没有返回值,status标识退出状态返回给父进程
执行失败则返回-1,错误存储在errno中
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 5 int test(void) 6 { 7 printf("test\n"); 8 sleep(2); 9 return 0; 10 } 11 12 int main(int argc,char* argv[]) 13 { 14 int i; 15 i++; 16 printf("i=%d\n",i); 17 while(1) 18 { test(); 19 printf("我是while循环\n"); 20 } 21 printf("循环结束"); 22 return 0; 23 }
[root@sun task]# ./exit
i=1
test
我是while循环
test
我是while循环
test
我是while循环
.........
^C
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 5 int test(void) 6 { 7 printf("test\n"); 8 sleep(2); 9 //return 0; 10 exit(0); 11 } 12 13 int main(int argc,char* argv[]) 14 { 15 int i; 16 i++; 17 printf("i=%d\n",i); 18 while(1) 19 { test(); 20 printf("我是while循环\n"); 21 } 22 printf("循环结束"); 23 return 0; 24 }
[root@sun task]# ./exite
i=1
test
_exit(status)
无返回值,只传递status给父进程后直接退出,父进程可以调用wait()获得子进程的状态
fork函数调用成功后,会为子进程申请PCB和用户内存空间,exit退出进程时释放了用户空间的资源,但是没有释放PCB,
释放PCB由父进程完成——wait(),waitpid()
wait(&status)
调用wait函数的父进程将阻塞等待该进程的任意一个子进程结束后,会后该子进程的内核进程资源,结束后返回结束的子进程的PID,将进程退出的状态保存在status
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <sys/wait.h> 5 #include <sys/errno.h> 6 #include <sys/types.h> 7 extern int errno;//在当前文件中引用,在当前项目的其他文件中定义的全局变量 8 int main(int argc,char* argv[]) 9 { 10 pid_t pid,pid_wait; 11 int status; 12 if((pid=fork())==-1) 13 perror("fork"); 14 if(pid==0) 15 { 16 printf("child pid is:%d\n",getpid()); 17 sleep(10); 18 exit(EXIT_FAILURE); 19 } 20 else 21 { 22 //printf("father pid is:%d\n") 23 pid_wait=wait(&status);//等待任意一个子进程结束后,返回当前结束的子进程pid 24 if(WEXITSTATUS(status)) 25 printf("wait on pid:%d,normal exit,return value is:%4x\n",pid_wait,WEXITSTATUS(status));//判断进程是否 26 正常退出WEXITSTATUS(status) 27 else if(WIFSIGNALED(status))//判断进程是否是因为收到信号而退出 28 printf("wait on pid:%d,recive signal,return value is:%4x\n",pid_wait,WIFSIGNALED(status)); 29 } 30 return 0; 31 }
[root@sun task]# ./wait
child pid is:3528
wait on pid:3528,normal exit,return value is: 1
waitpid(pid,status,0等待选项)
waitpid函数结束指定的子进程(指定的PID)