LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1015|回复: 7

求助:信号捕捉的一个问题

[复制链接]
发表于 2005-6-30 11:45:14 | 显示全部楼层 |阅读模式
我的程序是想捕捉SIGINT信号,可是我按下ctrl+c时,没有任何反应,其它的信号我也试过了,都没有反应,请问我的问题可能出在哪里?我的程序如下:
#include <signal.h>
#include <stdio.h>
main()
{
void f(int);
signal(SIGINT,f);
while(1){
printf("hello\n");
  }
}

void f(int signum)
{
printf("capture\n");
}

运行程序后当屏幕上面一直打印hello时我按下了ctrl+c,可是没有任何反应,请问时什么原因?还望大虾指教. 我的系统时redhat 9.0
发表于 2005-6-30 12:01:12 | 显示全部楼层
Post by yueying1205
我的程序是想捕捉SIGINT信号,可是我按下ctrl+c时,没有任何反应,其它的信号我也试过了,都没有反应,请问我的问题可能出在哪里?我的程序如下:
#include <signal.h>
#include <stdio.h>
main()
{
void f(int);
signal(SIGINT,f);
while(1){
printf("hello\n");
  }
}

void f(int signum)
{
printf("capture\n");
}

运行程序后当屏幕上面一直打印hello时我按下了ctrl+c,可是没有任何反应,请问时什么原因?还望大虾指教. 我的系统时redhat 9.0
我晕,这样你能看的出来么?改成这样就ok了
  1. #include <signal.h>
  2. #include <stdio.h>
  3. main()
  4. {
  5. void f(int);
  6. signal(SIGINT,f);
  7. while(1){
  8. sleep(1);
  9.   }
  10. }

  11. void f(int signum)
  12. {
  13. printf("capture\n");
  14. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-6-30 13:23:27 | 显示全部楼层
你把SIGINT的处理函数定位到了f()上,进程收到这个信号就会执行f()函数,就是打印capture回车

看看man signal吧,里边解释的很清楚
回复 支持 反对

使用道具 举报

发表于 2005-6-30 13:26:00 | 显示全部楼层
还有一个好习惯,就是把stdio.h和stdlib.h写在前边
回复 支持 反对

使用道具 举报

发表于 2005-6-30 16:59:05 | 显示全部楼层
Post by yueying1205
我的程序是想捕捉SIGINT信号,可是我按下ctrl+c时,没有任何反应,其它的信号我也试过了,都没有反应,请问我的问题可能出在哪里?我的程序如下:
#include <signal.h>
#include <stdio.h>
main()
{
void f(int);
signal(SIGINT,f);
while(1){
printf("hello\n");
  }
}

void f(int signum)
{
printf("capture\n");
}

运行程序后当屏幕上面一直打印hello时我按下了ctrl+c,可是没有任何反应,请问时什么原因?还望大虾指教. 我的系统时redhat 9.0


这样更容易看到结果:

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

  4. void f(int);

  5. main()
  6. {

  7.     signal(SIGINT,f);
  8.     while(1)
  9.     {
  10.         printf("hello\n");
  11.         sleep(1);   
  12.     }
  13. }

  14. void f(int signum)
  15. {
  16.     printf("captured.\n");
  17. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-6-30 21:06:40 | 显示全部楼层
不用sleep,ctrl-c是发给os,由os在进程切换时通知进程的,不存在
进程忙不过来接收信号。
问题在于滚屏太快,capture字样一闪而过,根本来不及看到。


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>
  4. void f(int);
  5. int i;
  6. int j;
  7. int main() {
  8.     i = 0;
  9.     j = 0;
  10.     signal(SIGINT, f);
  11.    while (1) {
  12.         if (i) printf("hello ");
  13.         if (j > 5) break;
  14.    }
  15.     return 0;
  16. }

  17. void f(int s) {
  18.      i = ! i;
  19.      ++j;
  20. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-6-30 21:45:57 | 显示全部楼层
sleep就是为了滚屏慢一点
回复 支持 反对

使用道具 举报

发表于 2005-7-1 14:39:08 | 显示全部楼层
sorry, 误解误解,呵呵
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表