⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p8-20.c

📁 SUN Solaris8平台下进程间通信
💻 C
字号:
#include <stdio.h>#include <sys/types.h>#include <sys/siginfo.h>#include <sys/signal.h>volatile pid_t pkid;/* SIGHCLD信号句柄.注意:技术上不支持信号句柄内调用printf,此处仅用于举例目的.*/void sigchld_handler(int sig, siginfo_t *sip, void *extra){     pid_t kid;     kid = sip->si_pid;     if (sip->si_code <= 0){  /* 子进程收到由其它进程发送的信号 */         printf("KILLED BY %d: Got signal %d, si_code %d for kid %d\n",                 sip->si_pid, sip->si_signo, sip->si_code,getpid());         exit(0);      /* 收到信号后正常终止,这将导致父进程进入该句柄 */     }     /* 父进程执行的代码 */           else if (sip->si_code == CLD_EXITED)          printf("EXIT: Got signal %d, si_code %d for kid %d\n",                 sip->si_signo, sip->si_code, kid);     else if (sip->si_code == CLD_DUMPED)          printf("ABORT: Got signal %d, si_code %d for kid %d\n",                sip->si_signo, sip->si_code, kid);     else if (sip->si_code == CLD_KILLED)          printf("KILLED: Got signal %d, si_code %d for kid %d\n",                sip->si_signo, sip->si_code, kid);         kid = wait(0);      printf("Parent got PID %d exiting\n\n", kid);     pkid = 0;         /* 设置信号处理完毕标志 */}int main(void){    struct sigaction sa;     /* 设置SIGHCLD句柄 */     sa.sa_sigaction = sigchld_handler;     sigemptyset(&sa.sa_mask);     sa.sa_flags = SA_SIGINFO;     if (sigaction(SIGCHLD, &sa, 0)) {         perror("sigaction");         exit(1);     }     printf("I am father,My pid=%d\n",getpid());     /* 创建一个子进程,该子进程先被kill然后从句柄内正常终止.*/      if (pkid = fork()){         printf("Parent forked %d\n", pkid);         printf("Parent will kill %d\n", pkid);         kill(pkid,SIGCHLD);     } else {        /* 第一个子进程 */           printf("Kid %d will be killed.\n", getpid());                      while(1);   /* 等待信号后终止 */     }     /*  父进程:忙等待直到子进程退出. */     while (pkid);     /* 创建一个子进程,该子进程将由于SIGABRT而死去 */      if (pkid = fork())         printf("Parent forked %d\n", pkid);     else {         /* 第二个子进程 */            sleep(1);         printf("Kid %d will now die with core file.\n",getpid());         abort();     }     /* 父进程:忙等待直到子进程退出. */     while(pkid);     printf("Parent: done\n" );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -