linux多线程信号总结

 

linux 多线程信号总结(一)

1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程执行的难以获知。也就是说,信号会随机发个该进程的一个线程。

2 signal函数BSD/Linux的实现并不在信号处理函数调用时,恢复信号的处理为默认,而是在信号处理时阻塞此信号,直到信号处理函数返回。其他实现可能在调用信号处理函数时,恢复信号的处理为默认方式,因而需要在信号处理函数中重建信号处理函数为我们定义的处理函数,在这些系统中,较好的方法是使用sigaction来建立信号处理函数。

3 发送信号给进程,哪个线程会收到?APUE说,在多线程的程序中,如果不做特殊的信号阻塞处理,当发送信号给进程时,由系统选择一个线程来处理这个信号。

4 如果进程中,有的线程可以屏蔽了某个信号,而某些线程可以处理这个信号,则当我们发送这个信号给进程或者进程中不能处理这个信号的线程时,系统会将这个信号投递到进程号最小的那个可以处理这个信号的线程中去处理。

5 如果我们同时注册了信号处理函数,同时又用sigwait来等待这个信号,谁会取到信号?经过实验,Linux上sigwait的优先级高。

6 在Linux中的posix线程模型中,线程拥有独立的进程号,可以通过getpid()得到线程的进程号,而线程号保存在pthread_t的值中。而主线程的进程号就是整个进程的进程号,因此向主进程发送信号只会将信号发送到主线程中去。如果主线程设置了信号屏蔽,则信号会投递到一个可以处理的线程中去。

7 当调用SYSTEM函数去执行SHELL命令时,可以放心的阻塞SIGCHLD,因为SYSTEM会自己处理子进程终止的问题。

8 使用sleep()时,要以放心的去阻塞SIGALRM信号,目前sleep函数都不会依赖于ALRM函数的SIGALRM信号来工作。

linux 多线程信号总结(二)

1. 默认情况下,信号将由主进程接收处理,就算信号处理函数是由子线程注册的

2. 每个线程均有自己的信号屏蔽字,可以使用sigprocmask函数来屏蔽某个线程对该信号的响应处理,仅留下需要处理该信号的线程来处理指定的信号。

3. 对某个信号处理函数,以程序执行时最后一次注册的处理函数为准,即在所有的线程里,同一个信号在任何线程里对该信号的处理一定相同

4. 可以使用pthread_kill对指定的线程发送信号

APUE的说法:每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有的线程共享的,

这意味着尽管单个线程可以阻止某些信号,但当线程修改了与某个信号相关的处理行为后,所

有的线程都共享这个处理行为的改变。这样如果一个线程选择忽略某个信号,而其他线程可

以恢复信号的默认处理行为,或者为信号设置一个新的处理程序,从而可以撤销上述线程的

信号选择。

进程中的信号是送到单个线程的,如果信号与硬件故障或者计时器超时有关,该型号就被发

送到引起该事件的线程中去,而其他的信号则被发送到任意一个线程。

sigprocmask的行为在多线程的进程中没有定义,线程必须使用pthread_sigmask

总结:一个信号可以被没屏蔽它的任何一个线程处理,但是在一个进程内只有一个多个线程共用的处理函数。......

linux 多线程信号总结(三)

1 Linux 多线程应用中,每个线程可以通过调用pthread_sigmask() 设置本线程的信号掩码。一般情况下,被阻塞的信号将不能中断此线程的执行,除非此信号的产生是因为程序运行出错如SIGSEGV;另外不能被忽略处理的信号SIGKILL 和SIGSTOP 也无法被阻塞。

2 当一个线程调用pthread_create() 创建新的线程时,此线程的信号掩码会被新创建的线程继承。

信号安装最好采用sigaction方式,sigaction,是为替代signal 来设计的较稳定的信号处理,signal的使用比较简单。signal(signalNO,signalproc);

不能完成的任务是:1.不知道信号产生的原因;

2.处理信号中不能阻塞其他的信号

而signaction,则可以设置比较多的消息。尤其是在信号处理函数过程中接受信号,进行何种处理。

sigaction函数用于改变进程接收到特定信号后的行为。

4 sigprocmask函数只能用于单线程,在多线程中使用pthread_sigmask函数。

5 信号是发给进程的特殊消息,其典型特性是具有异步性。

6 信号集代表多个信号的集合,其类型是sigset_t。

7 每个进程都有一个信号掩码(或称为信号屏蔽字),其中定义了当前进程要求阻塞的信号集。

所谓阻塞,指Linux内核不向进程交付在掩码中的所有信号。于是进程可以通过修改信号掩码来暂时阻塞特定信号的交付,被阻塞的信号不会影响进程的行为直到该信号被真正交付

忽略信号不同于阻塞信号,忽略信号是指Linux内核已经向应用程序交付了产生的信号,只是应用程序直接丢弃了该信号而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux驱动中的多线程指的是驱动程序中同时执行的多个线程多线程的产生有几个原因:多线程并发访问、抢占式并发访问、中断程序并发访问和SMP(多核)核间并发访问。 在编写Linux驱动程序时,我们需要考虑并发和竞争访问问题。并发访问会带来竞争问题,特别是在涉及共享数据段的临界区,我们必须保证一次只有一个线程访问临界区,也就是要保证临界区是原子访问的。这意味着一个访问操作必须是一个完整的步骤,不能再进行拆分。 为了避免并发和竞争访问,在编写驱动程序时,我们应该尽早考虑并发和竞争问题,而不是在编写完驱动程序后再处理这些问题。这样可以避免在调试过程中出现难以查找的问题,并提高驱动程序的可靠性。 在Linux驱动程序中,可以使用多种方法来处理多线程问题。其中一种常见的方法是使用互斥锁(mutex)来保护临界区,只允许一个线程访问临界区,其他线程需要等待。另一种方法是使用信号量(semaphore),允许多个线程同时访问临界区,但是需要控制访问的数量。还可以使用读写锁(rwlock)来实现对临界区的读写操作的并发访问控制。 在编写驱动程序时,我们还应该注意避免死锁的问题。死锁是指多个线程之间互相等待对方释放资源导致无法继续执行的情况。为了避免死锁,我们需要合理地设计锁的获取和释放顺序,并避免循环依赖。 总结起来,Linux驱动中的多线程是为了实现并发访问和提高系统性能。在编写驱动程序时,我们需要考虑并发和竞争访问问题,并使用适当的同步机制来保护临界区,避免死锁的发生[3]。 引用自:一, linux系统并发产生的原因和竞争问题. (n.d.). Retrieved from https://www.jianshu.com/p/05f3b8f41e2f 引用自:二, linux系统竞态问题描述. (n.d.). Retrieved from https://www.jianshu.com/p/eb1f9f0b5f16

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值