1

SIGINT をブロックし、基本的に「申し訳ありませんが、終了できません。\n」という信号があります。

問題は、これが scanf 中に発生する可能性があることです。

これが scanf 中に発生すると、scanf は printf を入力として取り込みます。

基本的にscanfが自動的にEnterキーを押すようにするprintfを実行するにはどうすればよいですか。入力が悪くても気にしません。そのscanfをprintfなどでプログラム的に終了したいだけです。

プロセス:

scanf("get stuff") -> ユーザーは入力できます。

-> SIGINT が発生し、ハンドラーに移動します。

-> ハンドラーは標準出力に「何とか何とか」と言います。

-> Scanf は何とか何とか何とか受け取り、さらなる入力を待っています。

scanf に戻ったときに終了するようにするにはどうすればよいですか (何を収集したかは気にせず、ユーザーの助けなしで続行したいだけです)。

編集: 2 つのシグナルを送信すると、scanf が終了します。プログラムで何らかの形で scanf の終了をエミュレートしたい。

4

2 に答える 2

1

あなたの質問は、あなたが混乱していることを示しています。あるいは、英語があなたの母国語ではないのかもしれません。

SIGINT をブロックし、基本的に「申し訳ありませんが、終了できません。\n」という信号があります。

あなたが持っているかもしれないのは、SIGINTに応答するように設定されたシグナルハンドラです。さらに、「signal()」関数を使用してハンドラーを設定している可能性がありますが、代わりに POSIX 標準の「sigaction()」関数を使用してハンドラーを設定することを目指している必要があります。

問題は、これが scanf 中に発生する可能性があることです。

コンテキストでは、「this」はおそらく、プログラムを停止したいユーザーによって入力された割り込み信号です。割り込みシグナルでプログラムを終了する人を止めることには注意してください。それをさせないと、彼らはもっと残忍になります。これは、代わりに SIGQUIT (およびおそらくコア ダンプ) を生成することを意味する場合があります。それもブロックすると、プログラムが反応する機会がなくなる究極の「kill -9 pid」に到達するまで、他の多くのトリックを試すことができます。

これが scanf 中に発生すると、scanf は printf を入力として取り込みます。

これは混乱しています...おそらく、「printf()」ステートメント(おそらく「終了できません」と言うステートメント)からの出力が「scanf()」への入力として見られていることを暗示していますか?これはかなりありそうにないようです...プロセスのI / Oで非常に奇妙なセットアップが必要になりますが、それが起こるとはまだ確信していません。

基本的にscanfが自動的にEnterキーを押すようにするprintfを実行するにはどうすればよいですか。入力が悪いことは気にしません。そのscanfをprintfなどでプログラム的に終了したいだけです。

いくつかの可能性があります - 使用している O/S に一部依存します (POSIX であっても)。私は「scanf()」を使用しません。コントロールが難しすぎると思います。割り込みハンドラが戻った後にシステムが読み取りを再開すると、苦労することになります。ただし、'scanf()' がすぐに停止して、処理したアイテムの数を返すことがあります。'scanf()' が終了しない場合は、単純に 'setjmp()' を呼び出してから 'scanf()' を呼び出す関数を呼び出す関数に 'sigsetjmp()' を挿入することを検討する必要があります。 . その後、シグナル ハンドラーは 'siglongjmp()' を使用して、その中間関数に戻ることができます。

sigjmp_buf trap;

int intermediary(int argument)
{
    if (sigsetjmp(trap) == 0)
    {
         function_calling_scanf(argument);
         return 0;  // Success
    }
    // Report failure
    return -1;
}

あなたの説明は続きます:

プロセス:

   scanf("get stuff") -> User is able to enter stuff in.

-> SIGINT が発生し、ハンドラーに移動します。

-> ハンドラーは標準出力に「何とか何とか」と言います。

-> Scanf は何とか何とか何とか受け取り、さらなる入力を待っています。

scanf が「何とか何とか」を読み取ったことをどうやって知ることができますか? それは私には非常にありそうにないように思えます。

scanf に戻ったときに終了するようにするにはどうすればよいですか (何を収集したかは気にせず、ユーザーの助けなしで続行したいだけです)。

を使用しsigsetjmp()ます。

編集: 2 つのシグナルを送信すると、scanf が終了します。プログラムで何らかの形で scanf の終了をエミュレートしたい。

これは、'sigaction()' ではなく、'signal()' を使用してシグナル ハンドラを設定していることを示しています。「signal()」を使用すると、割り込みが発生すると、シグナル ハンドラがデフォルトに戻されます。「sigaction()」では、その動作を要求する必要があります。デフォルトでは、受信したシグナル (SIGINT) はその間ブロックされ、シグナル ハンドラは有効なままです。最初の割り込みの実行中に 2 番目の割り込みが発生した場合、2 番目の割り込みは、最初のハンドラーが戻るまで保持されます (その時点で、ハンドラーは再入力されます)。

于 2010-03-25T04:24:34.033 に答える
0

バッファリングまたは再試行コードが邪魔になる可能性があるため、scanfを使用しないでください。呼び出しを使用する場合はread(2)、EINTRのerrnoで-1を返す必要があります。Scanfはそのエラーを確認し、読み取りを再試行する場合があります。生の読み取りからいつでもデータをsscanfできます。

これは、QNXが読み取りに対してPOSIXに準拠しており、検査用のscanfのソースがないことを前提としています。

于 2010-03-25T03:21:14.863 に答える