等待信号类型和数量 函数是否被阻塞信号中断 调用时是否改变信号掩码 返回时是否恢复原信号掩码 。
找了些资料说得乱七八糟的,多谢!!!
4 个解决方案
#1
帮顶
#2
帮顶
#3
pause()
用于挂起调用进程,直至其收到信号为止。信号不可是当前被调用进程设为忽略或阻塞(屏蔽)的信号。
如果信号使调用进程终止,则pause() 不会返回。
如果信号被调用进程捕获,并且从信号捕获函数返回控制,则调用进程从挂起点恢复执行;
并且从pause() 返回值-1,同时将errno 设为EINTR 。
线程注意事项
信号配置(例如捕获/缺省/忽略)由进程中的所有线程共享,并且每个线程都维护阻塞的信号掩码。
因此,正被等待的信号不应被进程忽略,或被调用线程阻塞。
在收到信号之前, pause() 将仅挂起调用线程。
如果进程中的其他线程不受阻塞的信号,则信号可能会传递到进程中的其他线程,同时pause() 中的线程可能会继续等待。
为此,对于多线程应用程序,建议使用sigwait() 而不是pause() 。
sigpause()
函数从调用进程的信号掩码中删除sig 并挂起调用进程直到接收到信号。
若要具有更广泛的可移植性,应相对于sigpause() 优先使用sigsuspend() 函数。
sigpause() 函数挂起调用进程,直到接收未阻塞的信号。如果保留了信号sig,则该信号会在进程暂停前释放。
sigpause() 用于在发生信号时测试更改的变量。
例如,应首先使用sighold() 来阻塞该信号,然后测试该变量。
如果都没有发生更改,则调用sigpause() 以等待该信号。
sigsuspend()
函数可将调用线程的当前信号掩码替换为sigmask 指向的信号集,然后挂起该线程,
直到传递一个信号为止,该信号的操作将是执行信号捕获函数或终止进程。
这不会导致在进程上一直未决的任何其他信号成为线程上未决的信号。
如果该操作是要终止进程,则sigsuspend() 将永远不会返回。
如果操作是要执行信号捕获函数,则sigsuspend()将在信号捕获函数返回后返回,
同时信号掩码恢复为调用sigsuspend() 之前已存在的信号集。
不能阻塞无法忽略的信号。这是系统强制的,不会导致显示错误。
线程注意事项
由于受阻塞的信号掩码在线程级进行维护,因此sigsuspend() 仅修改调用线程的受阻塞的信号掩码。sigsuspend()仅挂起调用线程直到它接收到信号为止。
如果进程中的其他线程未受阻塞的信号,则此信号可以传递到进程中的另一线程,而sigsuspend() 中的线程会继续等待。
由于此原因,对于多线程应用程序,建议使用sigwait() ,而不是sigsuspend() 。
用于挂起调用进程,直至其收到信号为止。信号不可是当前被调用进程设为忽略或阻塞(屏蔽)的信号。
如果信号使调用进程终止,则pause() 不会返回。
如果信号被调用进程捕获,并且从信号捕获函数返回控制,则调用进程从挂起点恢复执行;
并且从pause() 返回值-1,同时将errno 设为EINTR 。
线程注意事项
信号配置(例如捕获/缺省/忽略)由进程中的所有线程共享,并且每个线程都维护阻塞的信号掩码。
因此,正被等待的信号不应被进程忽略,或被调用线程阻塞。
在收到信号之前, pause() 将仅挂起调用线程。
如果进程中的其他线程不受阻塞的信号,则信号可能会传递到进程中的其他线程,同时pause() 中的线程可能会继续等待。
为此,对于多线程应用程序,建议使用sigwait() 而不是pause() 。
sigpause()
函数从调用进程的信号掩码中删除sig 并挂起调用进程直到接收到信号。
若要具有更广泛的可移植性,应相对于sigpause() 优先使用sigsuspend() 函数。
sigpause() 函数挂起调用进程,直到接收未阻塞的信号。如果保留了信号sig,则该信号会在进程暂停前释放。
sigpause() 用于在发生信号时测试更改的变量。
例如,应首先使用sighold() 来阻塞该信号,然后测试该变量。
如果都没有发生更改,则调用sigpause() 以等待该信号。
sigsuspend()
函数可将调用线程的当前信号掩码替换为sigmask 指向的信号集,然后挂起该线程,
直到传递一个信号为止,该信号的操作将是执行信号捕获函数或终止进程。
这不会导致在进程上一直未决的任何其他信号成为线程上未决的信号。
如果该操作是要终止进程,则sigsuspend() 将永远不会返回。
如果操作是要执行信号捕获函数,则sigsuspend()将在信号捕获函数返回后返回,
同时信号掩码恢复为调用sigsuspend() 之前已存在的信号集。
不能阻塞无法忽略的信号。这是系统强制的,不会导致显示错误。
线程注意事项
由于受阻塞的信号掩码在线程级进行维护,因此sigsuspend() 仅修改调用线程的受阻塞的信号掩码。sigsuspend()仅挂起调用线程直到它接收到信号为止。
如果进程中的其他线程未受阻塞的信号,则此信号可以传递到进程中的另一线程,而sigsuspend() 中的线程会继续等待。
由于此原因,对于多线程应用程序,建议使用sigwait() ,而不是sigsuspend() 。
#4
sigwait()
函数可从set 中自动选择和清除未决的信号,并返回sig 指向的位置中的信号的编号。
如果在调用时set中没有未决的信号,则调用线程将被挂起,
直至一个或多个信号成为未决信号,或线程被某一未阻塞的已捕获信号中断为止。
在调用sigwait() 时,应阻塞set 中的信号。否则,此行为是未定义的。
如果有多个信号排队等待获取选择的信号编号,
则sigwait() 将与第一个排队信号返回,而剩余信号将继续排队。
如果选择了范围SIGRTMIN 至SIGRTMAX 中多个未决信号中的任意一个,
则将返回编号最小的信号。未指定实时信号和非实时信号之间,或多个未决非实时信号之间的选择顺序。
如果某进程中的多个线程在sigwait() 中等待同一信号,则仅有一个进程从sigwait() 中返回信号编号;
尚未定义返回的线程。
线程注意事项
通过例行程序的sigwait 系列,线程可以同步等待多个信号。
这使sigwait 例行程序适于在多线程进程中处理信号。对于在多线程进程中处理信号的建议方法是,
使所有线程都阻塞相关信号,并专门使用一个线程调用sigwait函数,以等待接收信号。
如果某信号导致sigwait 函数返回,则可将处理信号的代码紧跟在sigwait 例行程序返回的结果后面。
处理信号之后,可以再次调用sigwait 函数,等待接收其他信号。
为确保使用专用线程处理信号,要切记使所有线程(包括发出sigwait 调用的线程)都阻塞相关信号。
否则,信号可能会被传递到除专用信号处理线程以外的其他线程。这可能会导致对信号执行缺省操作。
重要的是要使发出sigwait 调用的线程也受阻塞的信号。
这将防止在专用信号处理线程位于sigwait 函数的各调用之间时,执行缺省信号操作。
函数可从set 中自动选择和清除未决的信号,并返回sig 指向的位置中的信号的编号。
如果在调用时set中没有未决的信号,则调用线程将被挂起,
直至一个或多个信号成为未决信号,或线程被某一未阻塞的已捕获信号中断为止。
在调用sigwait() 时,应阻塞set 中的信号。否则,此行为是未定义的。
如果有多个信号排队等待获取选择的信号编号,
则sigwait() 将与第一个排队信号返回,而剩余信号将继续排队。
如果选择了范围SIGRTMIN 至SIGRTMAX 中多个未决信号中的任意一个,
则将返回编号最小的信号。未指定实时信号和非实时信号之间,或多个未决非实时信号之间的选择顺序。
如果某进程中的多个线程在sigwait() 中等待同一信号,则仅有一个进程从sigwait() 中返回信号编号;
尚未定义返回的线程。
线程注意事项
通过例行程序的sigwait 系列,线程可以同步等待多个信号。
这使sigwait 例行程序适于在多线程进程中处理信号。对于在多线程进程中处理信号的建议方法是,
使所有线程都阻塞相关信号,并专门使用一个线程调用sigwait函数,以等待接收信号。
如果某信号导致sigwait 函数返回,则可将处理信号的代码紧跟在sigwait 例行程序返回的结果后面。
处理信号之后,可以再次调用sigwait 函数,等待接收其他信号。
为确保使用专用线程处理信号,要切记使所有线程(包括发出sigwait 调用的线程)都阻塞相关信号。
否则,信号可能会被传递到除专用信号处理线程以外的其他线程。这可能会导致对信号执行缺省操作。
重要的是要使发出sigwait 调用的线程也受阻塞的信号。
这将防止在专用信号处理线程位于sigwait 函数的各调用之间时,执行缺省信号操作。
#1
帮顶
#2
帮顶
#3
pause()
用于挂起调用进程,直至其收到信号为止。信号不可是当前被调用进程设为忽略或阻塞(屏蔽)的信号。
如果信号使调用进程终止,则pause() 不会返回。
如果信号被调用进程捕获,并且从信号捕获函数返回控制,则调用进程从挂起点恢复执行;
并且从pause() 返回值-1,同时将errno 设为EINTR 。
线程注意事项
信号配置(例如捕获/缺省/忽略)由进程中的所有线程共享,并且每个线程都维护阻塞的信号掩码。
因此,正被等待的信号不应被进程忽略,或被调用线程阻塞。
在收到信号之前, pause() 将仅挂起调用线程。
如果进程中的其他线程不受阻塞的信号,则信号可能会传递到进程中的其他线程,同时pause() 中的线程可能会继续等待。
为此,对于多线程应用程序,建议使用sigwait() 而不是pause() 。
sigpause()
函数从调用进程的信号掩码中删除sig 并挂起调用进程直到接收到信号。
若要具有更广泛的可移植性,应相对于sigpause() 优先使用sigsuspend() 函数。
sigpause() 函数挂起调用进程,直到接收未阻塞的信号。如果保留了信号sig,则该信号会在进程暂停前释放。
sigpause() 用于在发生信号时测试更改的变量。
例如,应首先使用sighold() 来阻塞该信号,然后测试该变量。
如果都没有发生更改,则调用sigpause() 以等待该信号。
sigsuspend()
函数可将调用线程的当前信号掩码替换为sigmask 指向的信号集,然后挂起该线程,
直到传递一个信号为止,该信号的操作将是执行信号捕获函数或终止进程。
这不会导致在进程上一直未决的任何其他信号成为线程上未决的信号。
如果该操作是要终止进程,则sigsuspend() 将永远不会返回。
如果操作是要执行信号捕获函数,则sigsuspend()将在信号捕获函数返回后返回,
同时信号掩码恢复为调用sigsuspend() 之前已存在的信号集。
不能阻塞无法忽略的信号。这是系统强制的,不会导致显示错误。
线程注意事项
由于受阻塞的信号掩码在线程级进行维护,因此sigsuspend() 仅修改调用线程的受阻塞的信号掩码。sigsuspend()仅挂起调用线程直到它接收到信号为止。
如果进程中的其他线程未受阻塞的信号,则此信号可以传递到进程中的另一线程,而sigsuspend() 中的线程会继续等待。
由于此原因,对于多线程应用程序,建议使用sigwait() ,而不是sigsuspend() 。
用于挂起调用进程,直至其收到信号为止。信号不可是当前被调用进程设为忽略或阻塞(屏蔽)的信号。
如果信号使调用进程终止,则pause() 不会返回。
如果信号被调用进程捕获,并且从信号捕获函数返回控制,则调用进程从挂起点恢复执行;
并且从pause() 返回值-1,同时将errno 设为EINTR 。
线程注意事项
信号配置(例如捕获/缺省/忽略)由进程中的所有线程共享,并且每个线程都维护阻塞的信号掩码。
因此,正被等待的信号不应被进程忽略,或被调用线程阻塞。
在收到信号之前, pause() 将仅挂起调用线程。
如果进程中的其他线程不受阻塞的信号,则信号可能会传递到进程中的其他线程,同时pause() 中的线程可能会继续等待。
为此,对于多线程应用程序,建议使用sigwait() 而不是pause() 。
sigpause()
函数从调用进程的信号掩码中删除sig 并挂起调用进程直到接收到信号。
若要具有更广泛的可移植性,应相对于sigpause() 优先使用sigsuspend() 函数。
sigpause() 函数挂起调用进程,直到接收未阻塞的信号。如果保留了信号sig,则该信号会在进程暂停前释放。
sigpause() 用于在发生信号时测试更改的变量。
例如,应首先使用sighold() 来阻塞该信号,然后测试该变量。
如果都没有发生更改,则调用sigpause() 以等待该信号。
sigsuspend()
函数可将调用线程的当前信号掩码替换为sigmask 指向的信号集,然后挂起该线程,
直到传递一个信号为止,该信号的操作将是执行信号捕获函数或终止进程。
这不会导致在进程上一直未决的任何其他信号成为线程上未决的信号。
如果该操作是要终止进程,则sigsuspend() 将永远不会返回。
如果操作是要执行信号捕获函数,则sigsuspend()将在信号捕获函数返回后返回,
同时信号掩码恢复为调用sigsuspend() 之前已存在的信号集。
不能阻塞无法忽略的信号。这是系统强制的,不会导致显示错误。
线程注意事项
由于受阻塞的信号掩码在线程级进行维护,因此sigsuspend() 仅修改调用线程的受阻塞的信号掩码。sigsuspend()仅挂起调用线程直到它接收到信号为止。
如果进程中的其他线程未受阻塞的信号,则此信号可以传递到进程中的另一线程,而sigsuspend() 中的线程会继续等待。
由于此原因,对于多线程应用程序,建议使用sigwait() ,而不是sigsuspend() 。
#4
sigwait()
函数可从set 中自动选择和清除未决的信号,并返回sig 指向的位置中的信号的编号。
如果在调用时set中没有未决的信号,则调用线程将被挂起,
直至一个或多个信号成为未决信号,或线程被某一未阻塞的已捕获信号中断为止。
在调用sigwait() 时,应阻塞set 中的信号。否则,此行为是未定义的。
如果有多个信号排队等待获取选择的信号编号,
则sigwait() 将与第一个排队信号返回,而剩余信号将继续排队。
如果选择了范围SIGRTMIN 至SIGRTMAX 中多个未决信号中的任意一个,
则将返回编号最小的信号。未指定实时信号和非实时信号之间,或多个未决非实时信号之间的选择顺序。
如果某进程中的多个线程在sigwait() 中等待同一信号,则仅有一个进程从sigwait() 中返回信号编号;
尚未定义返回的线程。
线程注意事项
通过例行程序的sigwait 系列,线程可以同步等待多个信号。
这使sigwait 例行程序适于在多线程进程中处理信号。对于在多线程进程中处理信号的建议方法是,
使所有线程都阻塞相关信号,并专门使用一个线程调用sigwait函数,以等待接收信号。
如果某信号导致sigwait 函数返回,则可将处理信号的代码紧跟在sigwait 例行程序返回的结果后面。
处理信号之后,可以再次调用sigwait 函数,等待接收其他信号。
为确保使用专用线程处理信号,要切记使所有线程(包括发出sigwait 调用的线程)都阻塞相关信号。
否则,信号可能会被传递到除专用信号处理线程以外的其他线程。这可能会导致对信号执行缺省操作。
重要的是要使发出sigwait 调用的线程也受阻塞的信号。
这将防止在专用信号处理线程位于sigwait 函数的各调用之间时,执行缺省信号操作。
函数可从set 中自动选择和清除未决的信号,并返回sig 指向的位置中的信号的编号。
如果在调用时set中没有未决的信号,则调用线程将被挂起,
直至一个或多个信号成为未决信号,或线程被某一未阻塞的已捕获信号中断为止。
在调用sigwait() 时,应阻塞set 中的信号。否则,此行为是未定义的。
如果有多个信号排队等待获取选择的信号编号,
则sigwait() 将与第一个排队信号返回,而剩余信号将继续排队。
如果选择了范围SIGRTMIN 至SIGRTMAX 中多个未决信号中的任意一个,
则将返回编号最小的信号。未指定实时信号和非实时信号之间,或多个未决非实时信号之间的选择顺序。
如果某进程中的多个线程在sigwait() 中等待同一信号,则仅有一个进程从sigwait() 中返回信号编号;
尚未定义返回的线程。
线程注意事项
通过例行程序的sigwait 系列,线程可以同步等待多个信号。
这使sigwait 例行程序适于在多线程进程中处理信号。对于在多线程进程中处理信号的建议方法是,
使所有线程都阻塞相关信号,并专门使用一个线程调用sigwait函数,以等待接收信号。
如果某信号导致sigwait 函数返回,则可将处理信号的代码紧跟在sigwait 例行程序返回的结果后面。
处理信号之后,可以再次调用sigwait 函数,等待接收其他信号。
为确保使用专用线程处理信号,要切记使所有线程(包括发出sigwait 调用的线程)都阻塞相关信号。
否则,信号可能会被传递到除专用信号处理线程以外的其他线程。这可能会导致对信号执行缺省操作。
重要的是要使发出sigwait 调用的线程也受阻塞的信号。
这将防止在专用信号处理线程位于sigwait 函数的各调用之间时,执行缺省信号操作。