質問
Sigintをブロックし、基本的に「ごめんなさい、やめられない。 n」と言う信号があります。
問題は、これがSCANF中に発生する可能性があることです。
これがscanf中に発生すると、scanfは入力としてprintfを取り込みます。
SCANFが基本的にEnterキーを自動的にヒットするようにするprintfを実行するにはどうすればよいですか。入力が悪いことを気にしません。 printfなどでそのscanfをプログラム的に完成させたいだけです。
プロセス:
scanf( "get stuff") - >ユーザーはものを入力できます。
- > sigintが発生し、私のハンドラーに行きます。
- >ハンドラーは「何とか何とか何とか」と言います。
- > scanfはこの何とか何とか何とかを取り、より多くの入力を待っています。
SCANFを返すと、収集したものを気にしないでください。ユーザーヘルプなしで継続したいだけです)。
編集:2つの信号を送信すると、SCANFが終了します。 SCANFのエンディングを何らかの形でプログラムでエミュレートしたいと思います。
解決
あなたの質問は、あなたが混乱していることを示唆しています - あるいは、おそらく英語はあなたの母国語ではありません。
Sigintをブロックし、基本的に「ごめんなさい、やめられない。 n」と言う信号があります。
あなたが持っているかもしれないのは、Sigintに応答するように設定されている信号ハンドラーです。さらに、「Signal()」関数を使用してハンドラーを設定する場合がありますが、POSIX Standard 'Sigaction()'関数を使用してハンドラーを設定することを目指している必要があります。
問題は、これがSCANF中に発生する可能性があることです。
コンテキストでは、「これ」はおそらくあなたのプログラムを停止したいユーザーによって入力された割り込み信号です。割り込み信号を使用してプログラムを終了する人々を止めることに注意してください。あなたが彼らにそれをさせなければ、彼らはもっと残酷になります。それは、代わりにSigquit(そしておそらくコアダンプ)を生成することを意味するかもしれません。あなたもそれをブロックすると、あなたのプログラムが反応する機会が得られない究極の「キル-9 pid」に到達するまで、彼らが試すことができる他の多くのトリックがあります。
これがscanf中に発生すると、scanfは入力としてprintfを取り込みます。
これは混乱しています...あなたはおそらく、「printf()」のステートメント(おそらく「あなたはやめられない」と書かれているもの)からの出力が「scanf()」への入力と見なされていることを暗示していますか?それはかなりありそうもないように思えます...それはプロセスのI/Oで非常に奇妙なセットアップを必要とします、そして、私はそれが起こる可能性があると確信していません。
SCANFが基本的にEnterキーを自動的にヒットするようにするprintfを実行するにはどうすればよいですか。入力が悪いことを気にしません。 printfなどでそのscanfをプログラム的に完成させたいだけです。
いくつかの可能性があります - それはあなたが使用しているo/sに一部依存します(たとえそれがposixであっても)。私は 'scanf()'を使用しません。制御するのは難しすぎると思います。割り込みハンドラーが戻ってきた後にシステムが再開された場合、困難な時間があります。ただし、「scanf()」は短く停止し、処理したアイテムの数を返します。 「scanf()」が終了しない場合、「setjmp()」を呼び出す単純な関数で「sigsetjmp()」の互換を検討し、「scanf()」を呼び出す関数を呼び出すことについて考える必要があります。 。その後、信号ハンドラーは「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のエンディングを何らかの形でプログラムでエミュレートしたいと思います。
これは、「signer()」を使用して「sigaction()」ではなく信号ハンドラーを設定していることを示すものです。 「信号()」を使用すると、割り込みが発生すると、信号ハンドラーがデフォルトに戻ります。 「sigaction()」を使用すると、その動作を要求する必要があります。デフォルトでは、受信信号(SIGINT)が耐久性のためにブロックされ、信号ハンドラーは引き続き有効です。最初の中断が実行されているときに2番目の割り込みが発生した場合、2番目のハンドラーが戻るまで2番目の割り込みが保持されます(その時点でハンドラーが再入力されます)。
他のヒント
バッファリングまたは再試行コードが邪魔になる可能性があるため、SCANFを使用しないでください。使用する場合 read(2)
eintrのerrnoで-1を返す必要があります。 scanfはそのエラーを確認し、読み取りを再試行する場合があります。 Raw Readのデータをいつでもsscanfできます。
これは、QNXが読み取りのためにPOSIXに準拠しており、検査用のSCANFのソースがないことを前提としています。