- 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