信号究竟发给谁

在Linux中,进程和线程共用同一套信号机制。实验表明,如果信号由外部进程发送,如通过终端或shell,信号通常会发送给主线程;而如果信号由进程内的线程自己产生,如使用`raise()`函数,信号则会发送给产生信号的线程。这说明信号的接收取决于信号的来源。
摘要由CSDN通过智能技术生成
信号究竟发给谁

Linux中进程和线程本是一个东西,在内核中都是由task_struct结构标示。
两者都是由do_fork内核函数来启动,只是调用do_fork的参数不同。
如果进程只有一个线程,那么发给该进程的信号显然只能发给这个线程;
信号和信号处理函数是进程资源,那么当进程有多个线程时,信号究竟发给谁呢?
我做了3个实验来探讨这个问题,实验所采用的平台如下:

OS: fedora 11
kernel: 2.6.29.4-167.fc11.i686.PAE
gcc: (GCC) 4.4.0 20090506 (Red Hat 4.4.0-4)

编译命令:gcc -g -W -Wall -Wextra -o mytest main.c -lpthread

实验1
首先用下面的代码作测试
main.c:
========================================
// 2011年 11月 29日 星期二 08:37:06 CST
// author: 李小丹(Li Shao Dan) 字 殊恒(shuheng)
// K.I.S.S
// S.P.O.T

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>

#include <unistd.h>
#include <pthread.h>
#include <sys/syscall.h>

void *work_thread(void *);

void work();

void handler(int);

int main()
{
    struct sigaction sa;
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = handler;
    sa.sa_flags = SA_RESTART;
    sigemptyset(&sa.sa_mask);
    sigaction(SIGQUIT, &sa, 0);
    pthread_t tid;
    pthread_create(&tid, 0, work_thread, 0);
    work();
    return 0;
}

void handler(int s)
{
    char buf[32];
    snprintf(buf, sizeof(buf), "\n%ld r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值