目录
使用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它派生的子进程,或者父进程先终止