führen Sie ein Programm im hintergrund mit execvp Systemaufruf in c
bin ich ein Programm schreiben, das erhält einen Kommandonamen und Argumente und Optional auch den string "bg" am Ende , wenn die "bg" Zeichenfolge übergeben wird mein Programm ausgeführt wird der Befehl mit den Argumenten in den hintergrund, wenn nicht im Vordergrund, hier ist mein code:
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
{
pid_t pid;
int state;
if( (pid=fork())<0) {
perror("\nError in fork");
exit(-1);
}
else if(pid==0) {
if(strcmp(argv[argc-1], "bg") == 0 ){
strcpy(argv[argc-1],"&");
if( (execvp(argv[1], argv)<0)) {
perror("\nError in first execvp");
exit(-1);
}
}
else{
if( (execvp(argv[1], argv+1)<0)) {
perror("\nError en second el execvp");
exit(-1);
}
}
}
wait(&state);
printf("\nMy child %d terminated with state %d\n",pid,state);
exit(0);
}
Eingang Beispiel:
./myprogram ls -lai bg //in this case my program should execute "ls -lai" in background
./myprogram ls -lai //in this case it should execute command normally in foreground
mein code funktioniert, wenn die bg-argument nicht übergeben, aber wenn Sie übergeben, ich habe versucht, ersetzen Sie es mit "&" aber es hat nicht funktioniert, Hilfe ist willkommen Jungs.
- Verstehen Sie, was es bedeutet, "ein Programm ausführen im hintergrund"?
&
nicht verarbeitetexecvp()
, es verarbeitet, von der shell, ähnlich wie die Art und Weise der Verarbeitung derbg
token. Da bist du nicht die shell verwenden, um den Befehl ausführen, wird es keine Wirkung haben wird.- Wenn Sie möchten, um es zu laufen im hintergrund, nur Ausfahrt, ohne
wait()
. - Lesen Sie advancedlinuxprogramming.com
- Vazquez-Abrams ja ich denke mal das ist eine Hausaufgabe.
- Sie raten also? Dein code zeigt etwas anderes.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Unterschied zwischen backgrounding ein Programm - oder nicht - liegt darin, zu warten, für Sie zu beenden, oder warten Sie nicht. So müssen Sie nicht wirklich haben sind zwei verschiedene execvp ist. Aber, müssen Sie zu entfernen, wird der trailing-bg aus den Argumenten. Anhängen des & wird nicht alles tun - das & ist ein Metazeichen der shell, was sagt die shell nicht zu warten, bis das Programm, das gerade ausgeführt wird.
So, was Sie tun sollten, ist: