Hallo Ich arbeite nur an die Signalisierung zwischen zwei Prozessen. Ich habe einen Hauptprozess (zB MAIN
), der weiter läuft. Diese MAIN
wird von einem Wrapper-Prozess gespalten (z. B. WRAP
).Abfragen in Signalisierung zwischen Prozessen Linux
Hier ist mein Code, der den Prozess WRAP
startet, der wiederum einen untergeordneten Prozess wie MAIN
erstellen wird.
Wenn bestimmte Initialisierung in MAIN abgeschlossen ist, möchte ich ein Signal SIGUSR1
posten, das von WRAP
erfasst wird und einige andere Zeug macht.
Das Problem mit meinem Code ist, wenn das Signal von MAIN
ausgelöst wird es nie durch WRAP
Prozess gefangen wird. Pls. teile deine Vorschläge zu diesem Code oder wenn es andere Wege gibt, dies zu erreichen. Danke.
Im Hauptprozess:
Nach Init abgeschlossen Ich habe diesen Code hinzugefügt,
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;
}
In WRAP Prozess:
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");
}
Sie hinzugefügt haben TBIs Kabeljau wo genau? Wer tötet wen? Bitte posten ** vollständigen ** Code. Auch Gabel + System ?? –
Früher habe ich execvp() verwendet, um den Prozess zu starten, aber aus irgendeinem Grund wird der MAIN-Prozess nach einigen Sekunden nicht ausgeführt. Der große Code-Chunk ist ein Wrapper-Code und der MAIN-Prozess ist mehr LOC. Ich habe nur eine Zeile hinzugefügt, von wo ich das Signal erhöhen muss. – killer
Wenn der Code riesig ist, liegt es in Ihrer Verantwortung, ihn für einen [mcve] zu reduzieren. Diese Richtlinien existieren aus einem bestimmten Grund. Was ist 'pid' in' kill (pid, SIGUSR1); '? Niemand weiß. –