当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 13 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 信号处理
帖子发表于 : 2008-02-28 14:34 
头像

注册: 2006-09-21 14:28
帖子: 2376
送出感谢: 0 次
接收感谢: 0 次
1 设置信号
2 开始子进程计时(2秒过后跳到第四行)
3 等待用户输入 (不管输入与否2秒后跳到第四行)
4 其它工作

应该使用 alarm?

我看了《Linux 程序设计(第3版)》中的信号部分,奈何猪脑就是猪脑,看不慬。




代码:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

int status;

void warming(int sig)
{
   printf("\n [SIG %d] Times up! \n", sig);
   status = 0;
}

int main()
{
   char tmp[2];
   status = 1;
   printf("Start\n");
   alarm(2);
   signal(SIGALRM, warming);
   while (status)
   {
      printf("\n [status before 'scanf'] :: %d \n", status);
      scanf("%2s", tmp);
      printf("%s", tmp);
      printf("\n [status after 'scanf'] :: %d \n", status);
   }
   printf("\n [status out of 'while'] :: %d \n", status);
   return 0;
}
我想只要不管任何时候,只要 status = 0 时,一律跳到“4 其它工作“,而不是等待用户输入。

应该如何改?


_________________
http://lee.youxu.info/


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-02-28 14:44 
头像

注册: 2007-01-15 17:15
帖子: 3766
送出感谢: 0 次
接收感谢: 0 次
不明白你说什么


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-02-28 14:48 
头像

注册: 2006-09-21 14:28
帖子: 2376
送出感谢: 0 次
接收感谢: 0 次
http://forum.ubuntu.org.cn/viewtopic.php?t=106286&highlight=


_________________
http://lee.youxu.info/


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-02-28 14:48 
头像

注册: 2006-09-21 14:28
帖子: 2376
送出感谢: 0 次
接收感谢: 0 次
看了你就明白


_________________
http://lee.youxu.info/


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-02-28 14:53 
头像

注册: 2007-01-15 17:15
帖子: 3766
送出感谢: 0 次
接收感谢: 0 次
还是不明白, ... 而且现在已经没兴趣明白了


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-02-28 15:00 
头像

注册: 2006-09-21 14:28
帖子: 2376
送出感谢: 0 次
接收感谢: 0 次
你这是找骂。


_________________
http://lee.youxu.info/


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2008-02-29 9:43 
头像

注册: 2005-12-28 1:16
帖子: 3916
地址: 火星
系统: Ubuntu 12.10 X64
送出感谢: 1
接收感谢: 0 次
代码:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <setjmp.h>

int status;
jmp_buf env;

void warming(int sig)
{
    printf("\n [SIG %d] Times up! \n", sig);
    status = 0;
    longjmp(env,0);
}

int main()
{
    char tmp[2];
    status = 1;
    printf("Start\n");
    alarm(2);
    signal(SIGALRM, warming);
    setjmp(env);
    while (status)
    { 
        printf("\n [status before 'scanf'] :: %d \n", status);
        scanf("%2s", tmp);
        printf("%s", tmp);
        printf("\n [status after 'scanf'] :: %d \n", status);
    } 
    printf("\n [status out of 'while'] :: %d \n", status);
    return 0;
}


_________________
目前负债150多万


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2008-02-29 13:28 
头像

注册: 2007-03-13 17:26
帖子: 2254
送出感谢: 0 次
接收感谢: 1
神啊。。。。


alarm 这是发信号吗?

不是要在 设置信号连接signal 之后做的吗?


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2008-02-29 15:12 
头像

注册: 2006-09-21 14:28
帖子: 2376
送出感谢: 0 次
接收感谢: 0 次
IRC #gentoo-cn 上的老大随边看了一下,说用 select

代码:
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int
main(void) {
   fd_set rfds;
   struct timeval tv;
   int retval;

   int i;

   /* Watch stdin (fd 0) to see when it has input. */
   FD_ZERO(&rfds);
   FD_SET(0, &rfds);
   /* Wait up to five seconds. */
   tv.tv_sec = 5;
   tv.tv_usec = 0;

   retval = select(1, &rfds, NULL, NULL, &tv);
   /* Don't rely on the value of tv now! */

   if (retval)
   {
      printf("Data is available now.\n");
      /* FD_ISSET(0, &rfds) will be true. */
   } else {
      printf("No data within five seconds.\n");
      goto JMP;
   }
   scanf("%d", &i);
   printf("\n [%d] \n", i);
   
   JMP:

   printf("\n Continue? \n");
   getchar();
   getchar();
   
   return 0;
}


例子拷贝过来后,似乎可以实现了。但是,我看不懂 man select 的内容。


to xhy
我晚上试试你的。


_________________
http://lee.youxu.info/


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2008-02-29 15:14 
头像

注册: 2006-09-21 14:28
帖子: 2376
送出感谢: 0 次
接收感谢: 0 次
另外

如果可以的话,请你告诉我 select 的具体用法。


_________________
http://lee.youxu.info/


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2008-02-29 15:56 

注册: 2006-09-07 22:51
帖子: 849
送出感谢: 0 次
接收感谢: 0 次
flyinflash 写道:
另外

如果可以的话,请你告诉我 select 的具体用法。

我看过的下面的一本书见过select的用法,但忘了.

题名: LINUX编程宝典 (英文名: linux programing bible)
作者: JOHN GOERZEN 魏永民
出版项:北京:电子工业出版社,2000/12
页码: 748页
价格: 79.00元
主题:
索取号: TP312-61/2
分类: TP312-61
相关信息:


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2008-03-01 14:27 
头像

注册: 2005-12-28 1:16
帖子: 3916
地址: 火星
系统: Ubuntu 12.10 X64
送出感谢: 1
接收感谢: 0 次
使用signal定时确实不是什么好办法

某些版本的内核不能保证未决信号不会丢失


_________________
目前负债150多万


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2008-03-02 17:31 
头像

注册: 2006-09-21 14:28
帖子: 2376
送出感谢: 0 次
接收感谢: 0 次
这个是新的版本,因为用了非标准库,所以不能跨平台了。

原来梦寐以求的功能都实现了。


“同时做两件事情,并且相互通信”,用 select 实现了,但是,具体用法还是不懂。


附件:
0315.rar [21.33 KiB]
被下载 11 次


_________________
http://lee.youxu.info/
页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 13 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译