1. fork函数调用成功后,会为子进程申请PCB和用户内存空间,exit退出进程时释放了用户空间的资源,但是没有释放PCB,释放PCB由父进程完成
  2. 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)

 

 posted on 2013-12-30 16:48  瞌睡的美人鱼  阅读(391)  评论(0编辑  收藏  举报