2016-10-12 2 views
1

私は、nが引数として渡された場合、最初のn個の素数を計算するCプログラムを持っています。マイクロ秒以内に実行を完了するプログラムにSIGALRMを渡すには?

$ ./prime 5 
2 
3 
5 
7 
11 

プログラムのロジックは、私はプログラムのプロセスにSIGALRMを与えることができるなら、私に所望の機能に入力することができます。

だから基本的に私は、「プライム」は、単に素数を見つけるために、ループに入る前に、実行を開始したときに、別の端末で

kill -14 <PID of prime> 

を入力する必要があります。また、プログラムが実行されるたびにPIDが変化することにも留意されたい。

これらのアクションをすべて連結し、これを1行のコマンドで実行するにはどうすればよいですか?

+0

おそらく './prime 5; kill -14 $? ' – bishop

+0

@bishopセミコロンと同じように動作しません。コマンドは順番に実行されます。 – hax

+1

' ./prime 5&kill -14 $! 'を試してください。 – immibis

答えて

0

非常に珍しいシグナルの目的!

私が見ることができる最も簡単な方法は、primeをgdbで実行し、そのsignal関数を使用してシグナルをプログラムに送信することです。

raise(SIGALRM); 

をプログラム内の特定のポイントで:SIGALRMは、特定の時間に上げますことを確認するために

+0

はい、あなたは正しいです。通常のプログラムではまれです。しかしこれはチャレンジのための目的のコードです。今のところ、バイナリは別のマシン上にあります。私はあまり特権やgdbを持っていません。だから、私はその目的のために1行のシェルコマンドを探しています。 – hax

+1

あなたはそれを1本のラインで行うと信号を十分に速く送ることができると思いますか?もしあなたが十分速ければ、多くの人は、 'prime'が終了する前に次のコマンドを処理するためにシェルにタスクバックさえしません。 Linuxスケジューラは、通常、ミリ秒単位ではなく、ミリ秒単位で動作します。 –

+0

私は明確でない場合は謝罪します。私は単なる行コマンドを探しているという意味ではありませんでした。私は** SIGALRM **をプロセスに渡す方法を探しています。プロセスの名前があるところから開始します。だからここでの私の挑戦は、_kill -14_を供給しなければならない_process ID_を特定することです。私は_pidof_を試しましたが、問題は、私が殺すことを過ごしている間に、その時点でプロセスのPIDが再び必要なことです。私は今、なぜ私が単一のコマンドでそれを渡す方法を探しているのかは明らかかもしれません。 – hax

-1

おそらく最も簡単な方法は、追加することです。呼び出しが実行されると、SIGALRMは常に呼び出されます。

+0

ここでは、コードを変更して代替コードを作成するのではなく、実行可能ファイルを操作するはずです。 – hax

1

primeブロックをフルパイプへの書き込みにします。

この作業を行うには、システムのパイプ容量を正確に把握する必要があります。ほとんどのシステムでは、これは64 KB〜65536バイトです。いくつかの不明瞭なUNIXシステム(Mac OS Xではなく、Linuxではなく)にはパイプの容量が異なる場合があります。これが機能しない場合は、これを確認してください。パイプに

  • 書き込み65536ヌルバイト、それを埋める:

    (dd if=/dev/zero bs=65536 count=1 ; ./prime) | (sleep 3; cat) 
    sleep 1 
    killall -ALRM prime 
    

    最初のコマンドは、書き込み終了に次の処理を実行パイプを構築します。

  • 開始prime

と読み終わりに:3秒間

  • sleep
  • catはパイプからすべてを読み取り、EOFに達するまで印刷します。

prime開始は、パイプがnullバイトの64キロバイトのフルされ、他端にプロセスがパイプから読み出していないsleep 3、ある。 write()の最初の行を試し始めるとすぐにブロックされます。これが起こっている間にsleep 1が終了し、アラーム信号がprimeに届きます。これは簡単にブロックされます。これは、SIGALRMを取得したときの動作を表します。

sleep 3が終了すると、catはパイプからすべてを読み込み、印刷します。

関連する問題