[セットトップ]Linux下プロセス間通信メカニズム(三)信号Signal
しんごうおうとうかんすう
void(*signal(int signum, void(*handler)(int)))(int);
説明:
Signum:指定された信号(システムサポート)
handler:可能な値は3種類SIG_IGN(この信号を無視)SIG_DFL(システムのデフォルト操作)カスタム処理関数ポインタ
成功:前回設定した関数ポインタを返します.
失敗:-1
demo1:
運転手車掌問題:作成サブプロセスは車掌を代表し、親プロセスは運転手を代表し、同期プロセスは以下の通りである:車掌は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:
よりコンパクトなdemo 2:
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;
}
}