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にあります。
キーストロークを待っていますか? – m0skit0
宿題のような質問です。そのようにタグ付けする必要がありますか?とにかく、解決したい問題を理解していないと思います。 pause()呼び出しはユーザーの入力を待つことはありません。すなわち、 –
。キーボードイベントはここで必要な意味での信号ではありません。 –