linux結束程序
阿新 • • 發佈:2018-12-31
一、結束程序的五種方法
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)