Ich habe einen Elternprozess, der einige untergeordnete Prozesse erstellen muss. Der beste Weg, den ich gefunden habe, ist fork
+ execl
. Aber dann Elternprozess muss wissen, ob execl
des konkreten Kindes fehlschlägt oder nicht, und ich weiß nicht, wie man das umsetzt.Die beste Methode, um einen untergeordneten Prozess in Linux zu erstellen und einen möglichen Fehler zu behandeln
int pid = fork();
if (pid < 0) {
std::cout << "ERROR on fork." << std::endl;
} if (pid == 0) {
execl("/my/program/full/path", (char *)NULL);
exit(1);
}
else {
if (/*child's process execl fails*/) {
std::cout << "it failed" << std::endl
} else {
std::cout << "child born" << std::endl
}
}
Ich denke, diese Idee ist nicht gut:
int status(0);
sleep(100);
int res = waitpid(pid, &status, WNOHANG);
if (res < 0 && errno == 10) {
std::cout << "it failed" << std::endl
} else {
std::cout << "child born" << std::endl
}
weil es nicht gut ist, dass Kind-Prozess nach 100 Millisekunden wird sterben zu hoffen, ich will sicher wissen, dass da nur dieser Wille geschieht.
Ich denke auch, dass die Erstellung von shared_memory oder spezielle Rohrverbindung für eine solche Prüfung eine Cannon gegen Bienen ist.
Es muss eine einfache Lösung dafür geben, die ich gerade noch nicht gefunden habe.
Was ist der beste Weg, um das zu erreichen?
Verwenden Sie einfach 'popen' und überprüfen Sie den Rückgabewert. – Andrew
Nehmen wir an, es ist noch am Leben, wie kann ich sicher sein, dass Exec nicht fehlgeschlagen ist? Vielleicht ist es gescheitert, und der Prozess ist lebendig, nur weil er 'exit (1)' Anweisung noch nicht abgeschlossen hat. – Arkady
Möchten Sie überprüfen, ob Ihr Prozess * erfolgreich * gestartet wurde, oder * abgeschlossen * und * den Status Null * zurückgegeben hat? Die beiden sind sehr unterschiedlich. – Andrew