1. 程式人生 > >linux結束程序

linux結束程序

一、結束程序的五種方法

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)