Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4470447
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: LINUX

2011-12-29 09:41:46

“4.1linux异步signal列表“查看全部的信号 列表

  1. 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
附件代码: signal_simple.rar   将rar修改为tar.bz2
进程在执行时,按下”Ctrl+c“将向其发出SIGINT信号,kill正在运行的进程将向其发出SIGTERM信号,捕获这两种信号

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <signal.h>

  5. void handler(int signo)
  6. {
  7.         printf("Have caught sig N.O.%d\n",signo);
  8.         exit(EXIT_SUCCESS);
  9. }

  10. int main(void)
  11. {
  12.         signal(SIGINT,handler);
  13.         signal(SIGTERM,handler);
  14. // while(1);
  15.         pause();//会令目前的进程暂停(进入睡眠状态),直到被信号signal所中
  16.         exit(EXIT_SUCCESS);
  17. }
  1. ywx@ywx:~/Desktop/module/baohua/signal/signal_simple$ ./signal
  2. ^CHave caught sig N.O.2

  3. ywx@ywx:~/Desktop/module/baohua/signal/signal_simple$ ./signal &
  4. [1] 3007
  5. ywx@ywx:~/Desktop/module/baohua/signal/signal_simple$ kill 3007
  6. ywx@ywx:~/Desktop/module/baohua/signal/signal_simple$ Have caught sig N.O.15

  7. [1]+  Done                    ./signal
  8. 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()函数调用
附件代码: signal_async.rar   将rar修改为tar.bz2
  1. #include
  2. #include
  3. #include //getpid
  4. #include
  5. #include //STDIN_FILENO F_SETOWN F_GETFL #define FASYNC 00020000
  6. //#include <>
  7. #define MAX_LEN 100
  8. void input_handler(int num)
  9. {
  10. char data[MAX_LEN];
  11. int len;
  12. len = read(STDIN_FILENO,&data, MAX_LEN);//测试,如果这里 data 也是可以编译通过,并能执行的
  13. data[len] = 0;//字符串结束标志
  14. printf("input avaliable:%s\n",data);
  15. }
  16. int main(int argc, char **argv)
  17. {
  18. int oflags;
  1. signal(SIGIO,input_handler);
  2. //在《unix环境高级编程》p63
    //F_SETOWN:设置接收SIGIO和SIGURG信号的进程或进程组ID
    //设置本进程为STDIN_FILENO文件的拥有者
  3. fcntl(STDIN_FILENO,F_SETOWN,getpid());
  4. //获得文件状态标志
  5. oflags = fcntl(STDIN_FILENO,F_GETFL);
  6. //设置文件状态标志, 异步
  7. fcntl(STDIN_FILENO,F_SETFL,oflags | FASYNC);//FASYNC=00020000
  8. while(1);
  9. exit(EXIT_SUCCESS);
  10. }
  1. ywx@ywx:~/desktop/module/baohua/signal/signal_async$ ./signal
  2. i love linux
  3. input avaliable:i love linux
  4. ^C



阅读(1316) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~