3信号处理之:避免异步IO的类型,SIGCHLD信号处理
1避免異步I/O的類型
sig_atomic_t
????平臺下的原子類型
volatile(晚上上網查找)
????防止編譯器開啟優化選項是,優化對內存的讀寫。
2 SIGCHLD信號處理
SIGCHLD的產生條件
子進程終止時
子進程接收到SIGSTOP信號停止時
子進程處在停止態,接受到SIGCONT后喚醒時
案例說明:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
void sys_err(char *str)
{
perror(str);
exit(1);
}
void do_sig_child(int signo)
{
int status;
pid_t pid;
while ((pid = waitpid(0, &status, WNOHANG)) > 0) {
if (WIFEXITED(status))
printf("child %d exit %d\n", pid, WEXITSTATUS(status));
else if (WIFSIGNALED(status))
printf("child %d cancel signal %d\n", pid,WTERMSIG(status));
}
}
?
int main(void)
{
pid_t pid;
int i;
for (i = 0; i < 10; i++) {
if ((pid = fork()) == 0)
break;
else if (pid < 0)
sys_err("fork");
}
if (pid == 0) {
int n = 18;
while (n--) {
printf("child ID %d\n", getpid());
sleep(1);
}
return i;
}
else if (pid > 0) {
//先設置捕捉
//再解除對SIGCHLD的阻塞
struct sigaction act;
act.sa_handler = do_sig_child;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGCHLD, &act, NULL);
while (1) {
printf("Parent ID %d\n", getpid());
sleep(1);
}
}
return 0;
}
運行結果:
最后運行后的結果都是:Parent ID 6000
3.status處理方式
pid_t waitpid(pid_t pid,int *status,int options)
options
?????????WNOHANG
沒有子進程結束,立即返回
WUNTRACED
如果子進程由于被停止產生的SIGCHLD, waitpid則立即返回
WCONTINUED
如果子進程由于被SIGCONT喚醒而產生的SIGCHLD, waitpid則立即返回獲取status
WIFEXITED(status)
子進程正常exit終止,返回真
WEXITSTATUS(status)返回子進程正常退出值
WIFSIGNALED(status)
子進程被信號終止,返回真
WTERMSIG(status)返回終止子進程的信號值
WIFSTOPPED(status)子進程被停止,返回真
WSTOPSIG(status)返回停止子進程的信號值
WIFCONTINUED(status)
子進程由停止態轉為就緒態,返回真
4.sigqueue
??int sigqueue(pid_t pid,int sig,const union sigval value)
??union sigval{
?????int sival_int;
?????void *sival_ptr;
}
5 sigaction
void (*sa_sigaction)(int, siginfo_t *, void*)
siginfo_t {
int si_int; /* POSIX.1b signal */
void *si_ptr; /* POSIX.1b signal */
sigval_t si_value; /* Signal value */
...
}
sa_flags = SA_SIGINFO
?
?
總結
以上是生活随笔為你收集整理的3信号处理之:避免异步IO的类型,SIGCHLD信号处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 邵阳k41怎么进bios 邵阳K41进入
- 下一篇: 1.进程间的关系:终端,网络设备