一、结束进程的五种方法
1、正常结束
(1)main函数调用return;
(2)main函数调用exit函数
(3)main函数调用_exit函数
2、异常结束
(1)main函数调用abort函数
(2)进程被信号终止
二、return
return是我们最早接触的一种结束函数进程的方式,同vs下一样,若在子函数中,则返回函数的值,并返回执行权,在主函数中return 0;将结束该函数的生命;
int test()
{
ret=0;
return ret;
}
int main()
{
return 0;
}
三、exit函数
int exit(int status);
//调用该函数,将会导致程序正常终止,并返回给父进程该状态
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 int main()
5 {
6 pid_t pid = 0;
7 pid = fork();
8 int status;
9 if(pid == 0 )
10 {
11 // return 100;//return返回,见图一
12 exit(200);//exit()返回,见图二
13 }
14 if(pid > 0 )
15 {
16 wait(&status);
17 // printf("CODE= %d \n",WEXITSTATUS(status) );
printf("CODE2= %d \n",WEXITSTATUS(status) );
18 }
19 return 0;
20 }
%%%%%%%%图一如下所示:%%%%%%%%
%%%%%%%%%图二如下所示:%%%%%
在主函数中调用return和exit的结果基本是一样的功能
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
int test ()
{
//return 10;//见下图情况一
exit(10);//见下图情况二
}
4 int main()
5 {
6 pid_t pid = 0;
7 pid = fork();
8 int status;
9 if(pid == 0 )
10 {
test();//主函数调用子函数
13 }
14 if(pid > 0 )
15 {
16 wait(&status);
printf("CODE= %d \n",WEXITSTATUS(status) );
18 }
19 return 0;
20 }
%%%%%%%情况一(return 10;)%%%%%%%%
%%%%%%%情况二(exit( 10))%%%%%%%%%%
由上可以看出,在子函数中若要退出,选择exit更为合适
四、abort函数(异常终止)
void abort();
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 int main()
5 {
6 pid_t pid = 0;
7 pid = fork();
8 int status;
9 if(pid == 0 )
10 {
absort();
13 }
14 if(pid > 0 )
15 {
16 wait(&status);
printf("CODE= %d \n",WEXITSTATUS(status) );
18 }
19 return 0;
20 }
子函数调用absort时,进程异常结束,无法捕捉到退出码,会在当前目录下生成一个core文件,代表进程异常终止,如上所示;那么我们使用gdb来进行调试:
gdb -q pro core.12839//调试结果如下:
表示在函数中,遇到了absort( ),使得进程异常终止,但是,这种终止进程的方式是粗暴的,故而一般不用;
五、信号终止进程
《1》kill函数
int kill(pid_t pid, int sig );
//exit,abort都是用来杀死进程自己
//kill用来杀死另外一个进程
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include <sys/types.h>
5 #include<sys/wait.h>
6 #include<sys/stat.h>
7 #include<fcntl.h>
8
9 int main(int arg ,char* args[])
10 {
11 if(arg > 1)
12 {
13 int pid = atoi(args[1]);
14 kill(pid,SIGKILL);
15 }
16 else
17 {
18 printf("pid = %u\n ",getpid() );
19 sleep(50);
20 }
21 return 0;
22 }
程序执行结果如下:
可见,进程被杀死后,就僵硬了,^C是使用Ctrl+c键来强制结束的;那么实则上,Ctrl+c也是一个终止进程的信号:
//相当于调用了kill函数,传入了SIGINT信号
kill(pid,SIGINT)