-
void (*signal)(int signum,void(*handler))(int))) (int)
第一个参数指定信号的值,第二个参数指定针对前面信号值的处理函数,
若为 SIG_IGN,表示忽略该信号
若为 SIG_DFL, 表示采用系统默认方式处理信号
若为用户自定义的函数,则信号被捕捉到后,该函数将被执行
在《unix环境高级编程》p241页:
#define SIG_ERR (void(*)()) -1
#define SIG_DFL (void(*)()) 0
#define SIG_IGN (void(*)()) 1
linux设备驱动开发详解第九章 pp179
进程在执行时,按下”Ctrl+c“将向其发出SIGINT信号,kill正在运行的进程将向其发出SIGTERM信号,捕获这两种信号
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <unistd.h>
-
#include <signal.h>
-
-
void handler(int signo)
-
{
-
printf("Have caught sig N.O.%d\n",signo);
-
exit(EXIT_SUCCESS);
-
}
-
-
int main(void)
-
{
-
signal(SIGINT,handler);
-
signal(SIGTERM,handler);
-
// while(1);
-
pause();//会令目前的进程暂停(进入睡眠状态),直到被信号signal所中
-
exit(EXIT_SUCCESS);
-
}
-
ywx@ywx:~/Desktop/module/baohua/signal/signal_simple$ ./signal
-
^CHave caught sig N.O.2
-
-
-
ywx@ywx:~/Desktop/module/baohua/signal/signal_simple$ ./signal &
-
[1] 3007
-
ywx@ywx:~/Desktop/module/baohua/signal/signal_simple$ kill 3007
-
ywx@ywx:~/Desktop/module/baohua/signal/signal_simple$ Have caught sig N.O.15
-
-
[1]+ Done ./signal
-
ywx@ywx:~/Desktop/module/baohua/signal/signal_simple$
-
/////////////////////////////////////////////////////////////////////
怎么样实现异步通知??????
在LDD23 p169页中:
为了启动文件的异步通知机制,用户程序必须执行两个步骤。
1. 他们指定一个进程作为文件的”属主 owner“,当进程使用系统调用执行F_SETOWN命令时,属主进程的进程ID被保存在filp->f_owner中
signal(SIGIO,input_handler);
fcntl(STDIN_FILENO,F_SETOWN,getpid());
2.真正启动异步通知机制,用户程序还必须在设备中设置FASYNC标志 F_SETFL
oflags=fcnlt(STDIN_FILENO,F_GETFL);
fcntl=(STDIN_FILENO,F_SETFL,oflags|FASYNC);
1. 字符串就是一串零个或多个字符,其结束符为 0 ,但是总长度不包括结束符
2. unistd.h
#define STDIN_FILENO 0 标准输入
#define STDOUT_FILENO 1 标准输出
#define STDERR_FILENO 2 标准错误
那么 STDIN_FILENO 与 stdin 有什么区别呢??
stdin类型为 FILE* , STDIN_FILENO 类型为 int
stdin 使用在 fread fwrite fclose STDIN_FILENO 使用在 read write
stdin 是 用户层的C库 STDIN_FILENO 系统层的系统调用
使用信号实现异步通知的例子。它通过signal(SIGIO,input_handler)对标准输入文件描述符STDIN_FILENO启动信号机制。用户输入后,应用程序将接收到SIGIO信号,其处理函数input_handler()函数调用
-
#include
-
#include
-
#include //getpid
-
#include
-
#include //STDIN_FILENO F_SETOWN F_GETFL #define FASYNC 00020000
-
//#include <>
-
#define MAX_LEN 100
-
-
void input_handler(int num)
-
{
-
char data[MAX_LEN];
-
int len;
-
len = read(STDIN_FILENO,&data, MAX_LEN);//测试,如果这里 data 也是可以编译通过,并能执行的
-
data[len] = 0;//字符串结束标志
-
printf("input avaliable:%s\n",data);
-
}
-
-
int main(int argc, char **argv)
-
{
-
int oflags;
-
signal(SIGIO,input_handler);
-
//在《unix环境高级编程》p63
//F_SETOWN:设置接收SIGIO和SIGURG信号的进程或进程组ID
//设置本进程为STDIN_FILENO文件的拥有者
-
fcntl(STDIN_FILENO,F_SETOWN,getpid());
-
//获得文件状态标志
-
oflags = fcntl(STDIN_FILENO,F_GETFL);
-
//设置文件状态标志, 异步
-
fcntl(STDIN_FILENO,F_SETFL,oflags | FASYNC);//FASYNC=00020000
-
-
while(1);
-
exit(EXIT_SUCCESS);
-
}
-
ywx@ywx:~/desktop/module/baohua/signal/signal_async$ ./signal
-
i love linux
-
input avaliable:i love linux
-
^C
阅读(1316) | 评论(0) | 转发(0) |