Execl will nicht starten.
-
bluepeople12 schrieb:
Aber jetzt habe ich ein ganz anderes Problem. Und zwar wird das Programm gleich nach dem ersten Durchlauf beendet ...
Wie kann ich das verhindern ?Mehr Druchläufe machen!
Ernsthaft: Was soll so eine Frage? Wir kennen von deinem Programm drei Zeilen. Und die drei Zeilen haben allesamt nichts mit der Ablaufsteuerung zu tun. Wie sollen wir da jetzt diagnostizieren, was falsch ist?
-
Nunja ... wenn ich die Zeilen mit dem Befehl execlp auskommentiere ... zeigt mir mein Programm jeden Durchlauf an.
Wenn ich jedoch da lasse ... dann ist der erste Durchlauf fertig und das wars dann. Und ich denk mir dann als Folge, dass es an dem Befehl liegt.
Hier mal die Schleifen, um die es geht (dabei ist execlp auskommentiert):
Es wird hier geschaut, ob zwei strings gleich sind, und wenn ja, dann soll der Dateiname ausgegeben werden mit ein paar Zeilen aus dem Inhalt (und das geschieht über das Programm grep).
for (size_t i = 0; i < list_files.size() - 1; i++) { for (size_t j = 0; j < list_fileids.size(); j++) { // std::cout << "i: " << i << "\tj: " << j << "\n"; if (list_files.at(i).compare(list_fileids.at(j)) == 0) { // std::cout << list_files.at(i) << "\n"; // std::cout << i << "\n"; list_files.at(i + 1) = list_files.at(i + 1).replace( list_files.at(i + 1).size() - 1, 1, ""); std::cout << list_files.at(i + 1).c_str() << "\n"; /* if (execlp("grep", "grep", "-n", "-w", word.c_str(), list_files.at(i + 1).c_str(), NULL) == -1); { std::cout << "Error\n"; } */ } } }
-
Und was wundert dich da dran jetzt? Weißt du überhaupt, was die exec-Funktionen machen? Mal eine Manpage gelesen oder ein Beispiel angeguckt? Das exec alleine ersetzt den aktuellen Prozess mit einem neuen!
-
SeppJ schrieb:
bluepeople12 schrieb:
Aber jetzt habe ich ein ganz anderes Problem. Und zwar wird das Programm gleich nach dem ersten Durchlauf beendet ...
Wie kann ich das verhindern ?Mehr Druchläufe machen!
Der war gut.
-
SeppJ schrieb:
Und was wundert dich da dran jetzt? Weißt du überhaupt, was die exec-Funktionen machen? Mal eine Manpage gelesen oder ein Beispiel angeguckt? Das exec alleine ersetzt den aktuellen Prozess mit einem neuen!
Und mit welchem Befehl starte ich einfach einen neuen Prozess ohne ihn zu beenden ?
-
OK, ich habs schon mit system ...
-
bluepeople12 schrieb:
OK, ich habs schon mit system ...
Ähh, was hast du überhaupt vor?
-
Ich hab hier eine Liste an Dateien (Textdateien). In ihnen soll was gesucht werden und dies soll angezeigt werden.
Dass die Dateien existieren, ist garantiert. Dass da was drin ist, auch.
Und mit dem C++-Befehl system will ich grep starten, sodass mein Prozess nicht beendet wird ... sondern mehrfach, da ich ja jede Datei mit grep starten möchte und nach bestimmten Suchwörtern suche.Das hab ich vor ...
Ist da was falsch dran?
-
bluepeople12 schrieb:
Und mit welchem Befehl starte ich einfach einen neuen Prozess ohne ihn zu beenden ?
fork
edit: "ohne ihn zu beenden" ist natürlich Quark, bei exec wird nichts beendet, sondern ersetzt. Der übliche Weg, ein anderes Programm als Unterprozess zu starten, besteht in einer Kombination aus fork und exec: Erst fork, um einen Kindprozess abzuspalten. Dann im Kindprozess exec.
(oder system)
-
Ist system schlecht dafür ? Ich mein, bei mir funktionierts ...
-
exec* überschreibt den aktuellen Prozess mit einem neuen Prozess. Wie Bashar bereits gesagt hast, musst du daher vorher einen neuen Prozess anlegen. Das geht mit man: fork bzw. man: vfork.
pid_t pid = vfork(); if(pid == -1) { perror("vfork"); return 1; } else if(pid == 0) { // Neuer Prozess if(execlp(...) == -1) { perror("execlp"); } _exit(1); } else { int status; if(waitpid(pid, &status, 0) == -1) { perror("waitpid"); return 1; } if(WEXITSTATUS(status) != 0) { // Prozess hat mit einem Fehler beendet. // ... } }