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)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值