Warum child-Prozesses zurückgibt exit-status = 32512 in unix?
In meinem Programm, das ich ausführen Befehl gegeben und erste Ergebnis (log -, und exit-status). Auch mein Programm haben unterstützen shell-spezifische Kommandos (d.h. Befehle, die enthält shell bestimmte Zeichen ~(tild),|(pipe),*). Aber wenn ich versuche zu laufen sh -c ls | wc
in meinem home-Verzeichnis über mein Programm es fehlgeschlagen ist und deren exit-status war 32512, auch in den stderr-stream "sh: ls | wc: command not found"
gedruckt wurde.
Aber das interessante an der Sache ist, dass der Befehl sh -c ls | wc
arbeitet korrekt, wenn ich es in der shell.
Was ist das problem? Oder mehr vorzuziehen wie kann ich die shell-spezifische Kommandos über mein Programm (ich.EG, welcher Befehl mit welchen Parametern sollte ich laufen)?
Den code-Teil der Balg ist in untergeordneten Teil nach dem fork(). Es executs den Befehl.
tokenized_command
ist std::vector<std::string>
wo in meinem Fall "sh", "-c", "ls", "|", "wc"
gespeichert sind, auch die, die ich versucht habe zu speichern, es "sh", "-c", "\"ls | wc\""
aber das Ergebnis ist dasselbe. command
ist char *
wo vollständige Befehlszeile gespeichert wird.
boost::shared_array<const char *> bargv(new const char *[tokenized_command.size() + 1]);
const char **argv = bargv.get();
for(int i = 0; i < tokenized_command.size(); ++i)
{
argv[i] = tokenized_command[i].c_str();
printf("argv[%d]: %s\n", i, argv[i]); //trace
}
argv[tokenized_command.size()] = NULL;
if(execvp(argv[0], (char * const *)argv) == -1)
{
fprintf(stderr, "Failed to execute command %s: %s", command, strerror(errno));
_exit(EXIT_FAILURE);
}
P. S.
Weiß ich, dass mit system(command)
statt execvp
mein problem lösen kann. Aber system()
wartet, bis der Befehl beendet ist, und das ist nicht gut genug für mein Programm. Und auch ich bin mir sicher, dass bei der Umsetzung von system()
einer der exec-Familie-Funktionen verwendet wird, so kann das problem gelöst werden, über exec
als gut, aber ich weiß nicht, wie.
Ich wollte nicht sehen, alles, was mit der
c
oder c++
- tags, so dass ich entfernt Sie.Ich habe etwas im Zusammenhang mit der
c
und c++
.InformationsquelleAutor Mihran Hovsepyan | 2011-04-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
execvp
nimmt einen Pfad zu einer ausführbaren Datei, und die Argumente, mit denen zu starten, die ausführbare Datei. Es dauert nicht bourne-shell-Befehle.ls | wc
ist ein bourne-shell-Befehl (unter anderem), und es kann nicht zerlegt werden in den Pfad zu einer ausführbaren Datei und einige Argumente, die aufgrund der Nutzung von einem Rohr. Dies bedeutet, es kann nicht ausgeführt werden mitexecvp
.Ausführen ein bourne-shell-Befehl mit
execvp
man ausführen musssh
und pass-c
und der Befehl für Argumente.So, das Sie ausführen möchten
ls | wc
mitexecvp
.Sie offenbar versucht,
Das wäre das gleiche als bourne-shell-Befehl
sh -c ls '|' wc
.Und beide sind ganz anders als shell-Befehl
sh -c ls | wc
. Das wäreScheinen Sie zu denken
|
undwc
übergeben werden, diesh
, aber das ist nicht der Fall.|
ist ein besonderer Charakter, die Ergebnisse in einem Rohr, nicht ein argument.Als für die exit-code,
32512 = 0x7F00
Also es hat nicht sterben aus einem signal, einem core-dump nicht produziert, und es beendet mit dem code 127 (0x7F).
127 was bedeutet, dass unklar ist, was ist der Grund, warum es sollte, begleitet von einer Fehlermeldung. Sie haben versucht, führen Sie das Programm
ls | wc
, aber es gibt kein solches Programm.sh: ls | wc: command not found
dies ist die Botschaft/Hovsepyan, Sie versuchen, führen Sie die Datei mit dem Namen "
ls | wc
" eher als in der bourne-shell-Befehl "ls | wc
". Wenn Sie ausführen möchten, ein bourne-shell-Befehl, müssen Sie starten ein bourne-shell auf und übergibt dieser den Befehl.sh -c 'ls | wc'
.Ich glaube nicht, wan ' T, Mittag-shell. Ich wan ' T run shell-spezifische Kommandos von meinem Programm.
Hovsepyan. Es ist nicht klar, was du damit meinst. Wenn Sie meinen, Sie wollen vermeiden Sie die Ausführung einer shell, dann kann man sich einfach nicht ausführen
ls | wc
. Wenn Sie meinen, Sie wollen die shell konfigurierbar, ich weiß nicht wirklich den Punkt sehen, aber nichts hindert Sie.Hovsepyan. Wenn Sie vermeiden wollte, läuft eine shell ist, müssen Sie zum starten von zwei Prozessen (
ls
in einem,wc
im anderen), die Schaffung einer Pfeife zwischen Ihnen in den Prozess. Sie müssen auch zu verwalten, die Beendigung der beiden Prozesse statt. Es könnte sogar leichter sein, um die Funktionalität zu implementieren, die Sie möchten ausls
undwc
selbst.InformationsquelleAutor ikegami
Sollten Sie
sh -c 'ls | wc'
.Option
-c
erwartet, dass ein Befehl in form eines Strings. In der Schale, natürlich ist es Arbeit, da gibt es keinen Unterschied zwischen Laich -ls
und umleiten der Ausgabe zuwc
und startenls | wc
im separaten Schale.ls
und auch laichen einewc
zu erhalten, seinen Ausgang.Ja, ich weiß, ich wollte nur nicht, betonte er.
InformationsquelleAutor pajton