当前位置: 技术问答>linux和unix
进程处理信号都不陌生,但线程处理信号……,进者有分
来源: 互联网 发布时间:2015-06-14
本文导语: 我写线程时,需要在线程之间传递一些消息(就是32个基本消息)。有一些问题很是疑惑。 1、不是明确指定为线程的消息函数如:signal(), sigpause()等,不管在什么地方调用,都影响所有线程。我试了signal(SIGPIPE, SIG_I...
我写线程时,需要在线程之间传递一些消息(就是32个基本消息)。有一些问题很是疑惑。
1、不是明确指定为线程的消息函数如:signal(), sigpause()等,不管在什么地方调用,都影响所有线程。我试了signal(SIGPIPE, SIG_IGN),确实如此。是否所有的信号函数都如此?
2、pthread_sigmask函数只影响本线程的消息,但man帮助中的解释颇为不解:
Recall that signal masks are set on a per-thread basis, but signal
actions and signal handlers, as set with sigaction(2), are shared
between all threads.
是说重调用的话,pthread_sigmask会影响所有线程么?
但sigwait()的定义就感觉有些矛盾了。
sigwait suspends the calling thread until one of the signals in set is
delivered to the calling thread. It then stores the number of the sig-
nal received in the location pointed to by sig and returns. The signals
in set must be blocked and not ignored on entrance to sigwait. If the
delivered signal has a signal handler function attached, that function
is not called.
最后一句,应该说消息处理函数不调用,即signal(sig, sigHandleFunc);不起作用。是否sigwait能屏蔽signal函数?
3、如果一个线程调用过pthread_sigmask,之后外部调用sigprocmask(),是否线程的sig mask就改变了,sigwait的行为不再正确?
3、socket连接关闭时,调用send()会触发SIGPIPE,一般signal(SIGPIPE, SIG_IGN);就可以了。是否还有其他方法避免触发SIGPIPE?请告知。
4、我在main()中调用了signal(SIGPIPE, SIG_IGN),但运行后还能Broke pipe。我定位了一下程序,PQexec()(postgres库的接口函数)调用过后就会出现,注释掉就不会Broke pipe。请问PQexec()改变了SIGPIPE信号的行为吗?其它的postgres库函数有没有改变其他的信号行为呢?
请大家不吝指点,讲解一下线程消息的使用。如果有关线程处理消息的文章或参考,更是感激不尽。
1、不是明确指定为线程的消息函数如:signal(), sigpause()等,不管在什么地方调用,都影响所有线程。我试了signal(SIGPIPE, SIG_IGN),确实如此。是否所有的信号函数都如此?
2、pthread_sigmask函数只影响本线程的消息,但man帮助中的解释颇为不解:
Recall that signal masks are set on a per-thread basis, but signal
actions and signal handlers, as set with sigaction(2), are shared
between all threads.
是说重调用的话,pthread_sigmask会影响所有线程么?
但sigwait()的定义就感觉有些矛盾了。
sigwait suspends the calling thread until one of the signals in set is
delivered to the calling thread. It then stores the number of the sig-
nal received in the location pointed to by sig and returns. The signals
in set must be blocked and not ignored on entrance to sigwait. If the
delivered signal has a signal handler function attached, that function
is not called.
最后一句,应该说消息处理函数不调用,即signal(sig, sigHandleFunc);不起作用。是否sigwait能屏蔽signal函数?
3、如果一个线程调用过pthread_sigmask,之后外部调用sigprocmask(),是否线程的sig mask就改变了,sigwait的行为不再正确?
3、socket连接关闭时,调用send()会触发SIGPIPE,一般signal(SIGPIPE, SIG_IGN);就可以了。是否还有其他方法避免触发SIGPIPE?请告知。
4、我在main()中调用了signal(SIGPIPE, SIG_IGN),但运行后还能Broke pipe。我定位了一下程序,PQexec()(postgres库的接口函数)调用过后就会出现,注释掉就不会Broke pipe。请问PQexec()改变了SIGPIPE信号的行为吗?其它的postgres库函数有没有改变其他的信号行为呢?
请大家不吝指点,讲解一下线程消息的使用。如果有关线程处理消息的文章或参考,更是感激不尽。
|
1.有些消息是只针对线程有效的吧
2. sigwait的说明好像没有什么矛盾的,线程用了sigwait则信号到达后,就从后面的语句继续执行,即时定义了signal handler,那个handler也不会被调用,signal函数是用来替换handler的,不存在屏蔽不屏蔽的,只是线程执行了sigwait,消息来时,对应的sigHandleFunc就不被调用了
3。线程的sigmask应该没有该变,可是进程的mask被sigprocmask改变了,所以外部进程就不能将信号送入本进程了,更不用说线程
另一个3。不清楚,SIGPIPE触发就触发好了,在handler中不需要处理就可以
4。不清楚
2. sigwait的说明好像没有什么矛盾的,线程用了sigwait则信号到达后,就从后面的语句继续执行,即时定义了signal handler,那个handler也不会被调用,signal函数是用来替换handler的,不存在屏蔽不屏蔽的,只是线程执行了sigwait,消息来时,对应的sigHandleFunc就不被调用了
3。线程的sigmask应该没有该变,可是进程的mask被sigprocmask改变了,所以外部进程就不能将信号送入本进程了,更不用说线程
另一个3。不清楚,SIGPIPE触发就触发好了,在handler中不需要处理就可以
4。不清楚
|
1.线程信号我没有研究,不好意思
2、关于如何去掉连接出现PIPE信号的问题,在对socket进行读写操作的接口recv和send中最后一个参数设置为MSG_NOSIGNAL救可以了
如recv(sock, buf, size, MSG_NOSIGNAL);
2、关于如何去掉连接出现PIPE信号的问题,在对socket进行读写操作的接口recv和send中最后一个参数设置为MSG_NOSIGNAL救可以了
如recv(sock, buf, size, MSG_NOSIGNAL);
|
建议看看David R.Butenhof 的《POSIX 多线程程序设计》。
|
伙计 让你失望了
你问的问题 我现在不能一一给你一个明确的答案
现在又在出差 没有时间考究
sorry
等回去再和大家探讨
再次表示歉意
帮你UP
你问的问题 我现在不能一一给你一个明确的答案
现在又在出差 没有时间考究
sorry
等回去再和大家探讨
再次表示歉意
帮你UP
|
up
|
学习
|
OK
|
学习!!!
现在我也在研究这个东西
up
现在我也在研究这个东西
up