首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试EINTR信号

测试EINTR信号
EN

Stack Overflow用户
提问于 2012-09-14 20:27:14
回答 1查看 708关注 0票数 1

在我的程序中,我有一个系统调用'sendmsg()‘。我想测试一下如果这个系统调用被中断会发生什么。我怎么发动汽车呢?

代码语言:javascript
复制
int test(args) {
          -----
          /* I can use GDB and stop at this point */  
          n = sendmsg(h, send_msg, 0);
          ----
          return n; 
 }

 int test_caller(args) {
           int a, err;
           a = test(arg);
           if (a != what_i_am_expecting) {
               err = error;
               switch (err) {
                   case EINTR:
                       syslog(LOG_ERR, "I WANT TO SEE THIS LOG");
                       break;
                   default:
                }
            } else printf("Everything went well\n");
    return 0;
   } 

在这个函数中,我注册了一个信号处理程序,如下所示:

代码语言:javascript
复制
1366         struct sigaction sa;
1367         
1368         memset (&sa, '\0', sizeof(sa));
1369         sa.sa_handler = sighdl;
1370         sa.sa_flags = 0; 
1371         (void)sigaction(SIGINT, &sa, NULL);

使用此处理程序:

代码语言:javascript
复制
1349 static void
1350 sighdl(int signo)
1351 {
1352         int i = 0;
1353         syslog(LOG_ERR, "got signal %d", signo);
1354         for (i = 0; i < 100; i++) {
1355         }
1356 }

我的想法是在调用sendmsg()之前插入test()函数,然后将sigint发送给pid。但是不确定这个信号;,它是不是在test-caller中的EINTR情况下。

请帮帮我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-14 20:38:10

通常情况下,sendmsg调用很快。所以在这个过程中很难发出信号。但是有一种方法:

根据协议的不同,如果接收方队列已满,sendmsg将被阻塞。因此,以某种方式填充队列,然后在程序陷入sendmsg调用时按CTRL+C键(CTRL-C会导致SIGINT)。

因为你捕捉到了SIGINT,所以程序不会退出。sendmsg将返回代码-1和errno EINTR。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12424567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档