首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

循序渐进学unix——下机记录(五),signal

2012-12-30 
循序渐进学unix——上机记录(五),signal本文的主题是unix中的基本信号处理(signal)。在Unix中,一个进程可以向

循序渐进学unix——上机记录(五),signal

本文的主题是unix中的基本信号处理(signal)。

在Unix中,一个进程可以向另一个进程发送信号,接收进程再收到信号后可以根据配置做出相应反应。这也是一种通信机制。

涉及到的主要函数有:

signal,配置当前进程,在收到什么信号时执行什么函数。第一个参数为想要处理的信号,第二个参数为待执行函数名。kill,向指定pid的进程发送一个指定信号。(子进程的pid即父进程中fork的返回值)sigaction,使用signal定义的动作函数只能有一个int型参数,代表信号值。如果想获得更多信息,可使用sigaction。它与signal功能类似,但是传递了更多信息。(见后文示例代码)。1,Basic use。可通过在命令行提供参数来选择对信号的处理:默认,忽略,或执行某一函数。
#include<signal.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>int pipe1[2];int pipe2[2];int var;void sommef(int signum){float val1, val2;char buf[20]={0};char *str;int n = read(pipe1[0], buf, 20);buf[n] = '\0';printf("\tIn sommef, buf_read = %s\n",buf );str = strtok(buf, "<>");//What's the warning here???printf("\tIn sommef, val1 = %s\n",str );val1 = atof(str);str = strtok(NULL, "<>");printf("\tIn sommef, val2 = %s\n",str );val2 = atof(str);sprintf( buf, "<%d><%f>\n", getpid(), val1+val2);printf("\tIn sommef, buf_write = %s\n",buf );write( pipe2[1], buf, sizeof(buf));}void suicide(int signum){printf("Le fils est terminé.\n");close(pipe1[0]);close(pipe2[1]);exit(0);}void killfils( int signum){printf("Père re?ois SIGINT, envoie SIGUSR2 pour terminer le fils %d.\n", var);kill(SIGUSR2, var);printf("Père termine sois même.\n");close(pipe1[1]);close(pipe2[0]);exit(0);}void main(int argc, char** argv){pid_t val_fork;char buf[20];if(argc!=3){fprintf(stderr,"Usage: somme <valeur1> <valeur2>\n");exit(0);}pipe(pipe1);pipe(pipe2);if( (val_fork=fork())==0 ){//filsclose(pipe1[1]);close(pipe2[0]);
//忽略sigintsignal(SIGINT, SIG_IGN);//Le fils dois aussi traiter le SIGINT //求和操作signal(SIGUSR1, sommef); //自杀操作signal(SIGUSR2, suicide);while( 1){ sleep(3);}}else{var = val_fork;int n;float val1,val2;//Existe-il une meilleure fa?on?signal(SIGINT, killfils);close(pipe1[0]);close(pipe2[1]);sprintf(buf, "<%s><%s>", argv[1], argv[2]);write( pipe1[1], buf, sizeof(buf));//Laisser le fils finir sa configurationsleep(1);while(1){kill( val_fork, SIGUSR1);n=read( pipe2[0], buf, 20);buf[n] = '\0';printf("Résultat : %s\n", buf);printf("Nouveau calcul :\n");scanf("%f %f",&val1, &val2);sprintf(buf, "<%f><%f>", val1, val2);write( pipe1[1], buf, sizeof(buf));}}}

热点排行