[セットトップ]Linux下プロセス間通信メカニズム(三)信号Signal


しんごうおうとうかんすう
void(*signal(int signum, void(*handler)(int)))(int);
説明:
Signum:指定された信号(システムサポート)
handler:可能な値は3種類SIG_IGN(この信号を無視)SIG_DFL(システムのデフォルト操作)カスタム処理関数ポインタ
成功:前回設定した関数ポインタを返します.
失敗:-1
demo1:
#include<stdio.h>
#include<unistd.h>
#include<signal.h>

typedef void(*pFunc)(int);

void myhandler1(int signo)
{
    printf("myhander1 signo:%d
", signo); } void myhandler2(int signo) { printf("myhander2 signo:%d
", signo); } int main() { pFunc hander1, hander2; hander1 = signal(14, myhandler2);// hander2 = signal(14, myhandler1); // , , 。 alarm(5);//SIGALARM myhander1 signo:14 pause(); //hander1(100);// , hander2(100); // myhander2 signo:100 printf("exit
");// 14 , , return 0; }

運転手車掌問題:作成サブプロセスは車掌を代表し、親プロセスは運転手を代表し、同期プロセスは以下の通りである:車掌はSIGINT(運転を代表する)を捉え、SIGUSR 1を運転手に送り、運転手はSIGQUIT(駐車を代表する)を捉え、SIGUSR 2を運転手に送り、運転手はSIGTSTP(代表車からバス停まで)を捉え、SIGUSR 1を車掌に送る.車掌印刷(「please get off the bus」)信号処理:一、運転手:スナップ:SIGUSR 1 SIGUSR 2 SIGTSTP無視:SIGINT SIGQUIT二、車掌:スナップ:SIGINT SIGQUIT SIGUSR 1無視:SIGTSTP
demo2:
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>
#include<error.h>
#include<stdio.h>

int pid;//pid     ,      0,         pid


//    
void sellersigint(int signo)
{
    kill(getppid(),SIGUSR1);
}

void driversigusr1(int signo)
{
    printf("let's gogogo
"); } void sellersigquit(int signo) { kill(getppid(),SIGUSR2); } void driversigusr2(int signo) { printf("stop the bus
"); } void sellersigusr1(int signo) { printf("please get off the bus
"); } void driversigtstp(int signo) { kill(pid,SIGUSR1); } int main() { if((pid=fork()) == -1) { perror("error"); exit(1); } if(pid > 0)//driver { signal(SIGINT,SIG_IGN); // ( ) SIGINT (Ctrl + c) signal(SIGUSR1,driversigusr1);// SIGUSR1 signal(SIGQUIT,SIG_IGN); // ( ) SIGQUIT (Ctrl + \) signal(SIGUSR2,driversigusr2); // SIGUSR2 signal(SIGTSTP,driversigtstp); // ( ) SIGSTSP (Ctrl + z) while(1); } else //seller { signal(SIGINT, sellersigint);// ( ) SIGINT (Ctrl + c) signal(SIGQUIT,sellersigquit); // ( ) SIGQUIT (Ctrl + \) signal(SIGTSTP,SIG_IGN); ( ) SIGTSTP (Ctrl + z) signal(SIGUSR1,sellersigusr1); ( ) SIGUSR1 while(1); } }

よりコンパクトなdemo 2:
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

pid_t pid;

void conductor_handler(int signo);
void driver_handler(int signo);

int main()
{

    if((pid = fork()) < 0){ 
        perror("fork error.
"); } else if(pid == 0){ signal(SIGTSTP,SIG_IGN); signal(SIGINT,conductor_handler); signal(SIGQUIT,conductor_handler); signal(SIGUSR1,conductor_handler); while(1){ pause(); } } else{ signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); signal(SIGTSTP,driver_handler); signal(SIGUSR1,driver_handler); signal(SIGUSR2,driver_handler); while(1){ pause(); } } return 0; } void conductor_handler(int signo) { switch(signo) { case SIGINT : kill(getppid(),SIGUSR1); break; case SIGQUIT: kill(getppid(),SIGUSR2); break; case SIGUSR1: printf("Final station ,all get off.
"); exit(0); } } void driver_handler(int signo) { switch(signo) { case SIGTSTP : kill(pid,SIGUSR1); wait(NULL); exit(0); case SIGUSR1 : printf("bus will run...
"); break; case SIGUSR2 : printf("bus will stop...
"); break; } }