こんにちは私はちょうど2つのプロセス間のシグナリングに取り組んでいます。私はメインプロセス(例えば、MAIN
)を実行し続けます。このMAIN
は、ラッパープロセス(例えば、WRAP
)からフォークされます。プロセス間のシグナリングでの問い合わせLinux
実際にWRAP
プロセスを起動するコードは、MAIN
という子プロセスを作成します。
MAINで特定の初期化が完了したら、SIGUSR1
という信号を投稿したいと思います。これはWRAP
でキャプチャされ、その他のものがあります。
私のコードでの問題は、信号がMAIN
から発生したときに、それがWRAP
プロセスによって決してトラップされないことです。 Pls。このコードであなたの提案を共有したり、これを達成するための他の方法がある場合は、 ありがとうございます。 MAIN過程で
:
初期化が完了した後、私は、WRAPプロセスで
main()
{
// Do some work here
int pid = GetProcessID(); // Returns the process ID of WRAP process
kill(pid,SIGUSR1); // Tries to send signal to WRAP process
// Other code
}
int GetProcessID()
{
int pid = 0;
char results[128];
FILE *fp = popen("pgrep WRAP", "r");
if(fp == NULL)
{
printf("Error: Failed to get Process ID");
}
else
{
while(fgets(results, 128, fp) != NULL)
{
pid = atoi(results);
}
pclose(fp);
}
return pid;
}
をこのコードを追加しました:
main()
{
int pid;
signal(SIGUSR1,InitComplete);
if ((pid = fork()) < 0)
{
perror("fork");
exit(1);
}
if (pid == 0)
{
/* child */
system("mainProc.out");
}
else
{
/* parent */
if(KeepListening() == 1)
printf("Init completed successfully\n");
}
return 0;
}
int KeepListening()
{
const int MAX_WAIT_TIME = 180;
int procStarted = 0;
int res = 0;
sigset_t origset;
sigset_t ss;
sigemptyset(&ss);
sigaddset(&ss, SIGWINCH);
sigaddset(&ss, SIGUSR1);
res = sigprocmask(SIG_BLOCK, &ss, &origset);
if(res)
{
printf("\nError: sigprocmask returned an error\n");
}
struct timespec theTimeout;
theTimeout.tv_nsec = 0;
theTimeout.tv_sec = MAX_WAIT_TIME;
int sig = 0;
siginfo_t theInfo;
memset(&theInfo, '\0', sizeof(theInfo));
int timedwaitcount = 0;
do
{
sig = sigtimedwait(&ss, &theInfo, &theTimeout);
if(sig < 0)
{
if(EAGAIN == errno)
{
timedwaitcount++;
}
else
{
PrintMessage("Error:Error occured with sigtimedwait\n");
}
}
else
{
timedwaitcount = 0;
}
if(SIGUSR1 == sig)
{
return 1;
}
}while(SIGWINCH == sig || 0 == sig);
return procStarted;
}
void InitComplete()
printf("InitComplete in MAIN. Signal Received.\n");
}
を[ENTER]?誰が誰を殺しますか? **完全な**コードを投稿してください。また、フォーク+システム? –
私はexecvp()を使用してプロセスを起動しましたが、何らかの理由でMAINプロセスが数秒後に実行されません。巨大なコードチャンクはラッパーコードであり、MAINプロセスはより多くのLOCのものです。私は信号を上げる必要がある場所から1行だけ追加しました。 – killer
コードが巨大であれば、[mcve]を減らすことはあなたの責任です。これらのガイドラインは、理由により存在します。 'kill(pid、SIGUSR1);の' pid'とは何ですか?誰も知らない。 –