【C/C++】C语言signal信号|软中断信号|程序捕获Ctrl+C 信号

本文介绍了在Linux环境下,如何使用C语言捕获Ctrl+C信号来终止程序,并探讨了软中断信号处理,特别是`signal(SIGCHLD, SIG_IGN)`在处理僵尸进程中的应用。通过示例程序展示了信号处理函数的使用,以及`SIGCHLD`信号对子进程结束的响应。" 6095548,995833,VMware上安装Mac OS X Server 10.6教程,"['虚拟机', '虚拟化', 'vmware', 'os', 'server']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

程序捕获Ctrl+C 信号

软中断信号

signal(SIGCHLD, SIG_IGN)

SIGCHLD信号

SIG_ING

使用signal(SIGCHLD, SIG_IGN)处理僵尸进程


程序捕获Ctrl+C 信号

在Linux下面写一个程序,如果程序中出现死循环的话,我们就应该在键盘上按Ctrl+C来终止我们的程序,那么我们也可以取捕获这个信号,然后执行我们自己的信号处理程序,输出一些有用的信息来帮助我们调试程序。信号和中断很像,我们既可以使用OS的中断处理程序,也可以截获中断执行自己的中断处理程序。下面是一个多线程的例子:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

#define true 1

void *One(void *no) 
{
      while (true)
          {
          printf("NUAACS1\n");
          sleep(1);
         
    }
}

void *Two(void *no) ?
{
      while (true)
          {
          printf("NUAACS2\n");
          sleep(1);
         
    }
}

void Stop(int signo) 
{
      printf("oops! stop!!!\n");
      _exit(0);
}

int main()
{
      int res;
      pthread_t A, B;

      signal(SIGINT, Stop);
    
      res = pthread_create(&A, NULL, One, NULL);
      res = pthread_create(&B, NULL, Two, NULL);
      res = pthread_join(A, NULL);
      res = pthread_join(B, NULL);

      return 0;
}

编译上述程序的命令:gcc nuaa.c -o nuaa -l pthread(假设程序所在文件名位nuaa.c)

注:

1.上述程序中创建了两个线程,线程执行函数的名字随便写,但是线程执行函数的格式必须这么写。

2.在上述程序中我故意使用了_exit(0);目的是说明一个问题,_exit(0)和exit(0)的区别是什么?:首先exit(0)是通过_exit(0)来实现的,其次,exit(0)回执行一些后续的处理,比如把缓冲区中的内容写到磁盘的相应位置上,关闭没有关闭的文件......而_exit(0)不会做这些事情。
原文链接:https://blog.youkuaiyun.com/nuaa_ybl/article/details/7091745

软中断信号

signal(SIGCHLD, SIG_IGN)

signal(参数一,参数二)

  • 参数一:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。
  • 参数二:我们处理的方式(是系统默认还是忽略还是捕获)。可以写一个handdle函数来处理我们捕获的信号。

SIGCHLD信号

子进程结束时, 父进程会收到这个信号。
如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情 况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程 来接管)。

SIG_ING

忽略的意思

使用signal(SIGCHLD, SIG_IGN)处理僵尸进程

SIGCHLD信号是子进程退出的时候向父进程发送的,signal(SIGCHLD, SIG_IGN)表示父进程忽略SIGCHLD信号。(SIG_IGN表示忽略)

通过signal(SIGCHLD, SIG_IGN)通知内核对子进程的结束不关心,由内核回收。如果不想让父进程挂起,可以在父进程中加入一条语句:signal(SIGCHLD,SIG_IGN);

子进程结束时, 父进程会收到这个信号。
如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情 况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值