このプログラムの目的は、親ループが無限に割り込みを待つ間にフォークして子をスリープさせることです。^Cを押すと、void parent
関数が呼び出されます。ただし、この部分は動作しますが、kill (pid, SIGALRM)
のメッセージは機能しません。私はチェックし、pid
は、その子供の正しいプロセスIDです。C++プロセスフォークとシグガラーム
私はしばらく検索しましたが、私が間違っていることは見つかりませんでした。私は親に子プロセスから前kill (pid, SIGALRM)
を使用しますが、これは動作していない理由を私は理解することはできません。..
#include <signal.h>
#include <unistd.h>
#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
int pid;
void parent (int sig)
{
kill (pid, SIGALRM);
cout << "I'm a parent " << getpid() << " My child is " << pid << endl;
}
void child (int sig)
{
cout << "I am " << getpid() << "my parent is " << getppid()<< endl;
cout << "Use ctrl+backslash to actually end the program" << endl;
}
int main()
{
pid = fork();
if(pid == 0)
{ //Child process
cout << "Child pid = " << getpid() << " Waiting for interrupt." << endl;
(void) signal (SIGALRM, child);
pause();
}
else if(pid > 0)
{ //Parent
sleep(2);
cout << "child pid = " << pid << endl;
struct sigaction act;
act.sa_handler = parent;
sigemptyset (&act.sa_mask);
sigaction (SIGINT, &act, 0);
while(1)
{
sleep (1);
}
}
return 0;
}
出力は何ですか?また、どのOSでこれを実行していますか?また、ここではペナルティなので、これらのシグナルハンドラはCリンケージで定義する必要があります。 (つまり、それらをextern "C"ブロックに入れてください) – Arafangion
また、iostreamがシグナルハンドラで使用するのが安全であることをどのように知っていますか?私はこれがhttp://stackoverflow.com/questions/7623401/override-ctrl-cの複製であるかどうか疑問に思っています(しかし、たとえそうであっても、この質問はそのままにしておく価値があると思います) – Arafangion
私はFedora 15を使用しています。 私が手出力は次のようになります。 '子のpid = 23779 interrupt.' '子を待っているのpid = 23779' '^ CI'm親23778私の子供は23779' '^CI'm親であります23778私の子供は23779です。 '^ \終了(コアダンプ)' そして、extern Cブロックのおかげで、私はこれまでに使ったことがありません – OrangeGrover