2013-04-13 4 views
15

私はcで完全にnoobです。私は、mypause()関数を書く必要があります。これは、pause()システムコールと同様の機能を持ち、信号待ちを繰り返しブロックするプログラムでmypause()関数をテストします。 テグpause()の機能はどのように動作しますか?プログラムはシグナルをブロックして待つようにするためにpause()はどのように機能しますか?

fprintf(stderr, "press any key to continue\n"); 

:私はちょうどこのようmypause()を行うことはできませんか?

pause()またはsigpause()を使用することはできません。

+0

キーストロークを待っていますか? – m0skit0

+1

宿題のような質問です。そのようにタグ付けする必要がありますか?とにかく、解決したい問題を理解していないと思います。 pause()呼び出しはユーザーの入力を待つことはありません。すなわち、 –

+0

。キーボードイベントはここで必要な意味での信号​​ではありません。 –

答えて

13

pause()は、信号が到着するまで機能しません。ユーザー入力は信号ではありません。シグナルは、別のプロセスまたはシステム自体によって放出されることがあります。

は、例えばCtrl-C押すと、通常例で殺されるプロセスを引き起こし、現在実行中のプロセスにSIGINT信号を送信するために、あなたのシェルの原因となります。

pauseの動作をISO C99でエミュレートするには、次のような記述があります。コードはコメントされています。この実装に関する質問がある場合は、お尋ねください。

#include <unistd.h> 
#include <stdio.h> 
#include <signal.h> 

/** 
* The type sig_atomic_t is used in C99 to guarantee 
* that a variable can be accessed/modified in an atomic way 
* in the case an interruption (reception of a signal for example) happens. 
*/ 
static volatile sig_atomic_t done_waiting = 0; 

static void  handler() 
{ 
    printf("Signal caught\n"); 
    done_waiting = 1; 
} 

void my_pause() 
{ 
    /** 
    * In ISO C, the signal system call is used 
    * to call a specific handler when a specified 
    * signal is received by the current process. 
    * In POSIX.1, it is encouraged to use the sigaction APIs. 
    **/ 
    signal(SIGINT, handler); 
    done_waiting = 0; 
    while (!done_waiting) 
    ; 
} 

int  main() 
{ 
    my_pause(); 
    printf("Hey ! The first call to my_pause returned !\n"); 
    my_pause(); 
    printf("The second call to my_pause returned !\n"); 
    return (0); 
} 

この例は、SIGINT信号でのみ機能します。追加のシグナルセットを処理するには、別のシグナル番号を持つsignal()の別のコールを使用するか、sigaction()を使用して、すべての希望のシグナルを参照するマスクを使用します。

ご使用のシステムで使用可能な信号の完全なリストは、<signal.h> includeにあります。

+4

ビジー待機は悪いです。その睡眠をそのループに入れてください。 – Dave

+1

(睡眠は信号のために早く起きるでしょう) – Dave

+1

ありがとうHalim Qarroumこれは私が必要としていたものです。 –

関連する問題