1

私のプログラムには、システムコール「sendmsg()」があります。このシステムコールが中断された場合に何が起こるかをテストしたいと思います。どうすればいいですか?

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;
   } 

この同じ関数で、次のようにシグナルハンドラーを登録しました。

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);

このハンドラーを使用すると:

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に送信することです。しかし、この署名についてはよくわかりません;、それはテスト発信者のEINTRケースに行きますか?

助けてください!

4

1 に答える 1

1

通常、sendmsg電話は迅速です。そのため、その間に信号を送るのは困難です。しかし、方法があります:

プロトコルによってはsendmsg、受信者のキューがいっぱいになるとブロックされます。したがって、何らかの方法でキューを埋め、プログラムが呼び出しでスタックしているときにCTRL + Cを押しsendmsgます(CTRL-CはSIGINTを引き起こします)。

SIGINTをキャッチしたため、プログラムは終了しません。はsendmsgコード-1とerrnoEINTRで返されます。

于 2012-09-14T12:38:10.003 に答える