Sto programmando una shell UNIX e devo usare il execv()
chiamata di sistema per creare un processo. Uno dei parametri per execv()
è il percorso del file per l'eseguibile. Quindi se qualcuno digita /bin/ls
, eseguirà il ls
eseguibile. Ma ciò di cui ho bisogno è una funzione tale che quando ls
viene digitato, cercherà il percorso del file di ls
(come il which
comando). Esiste una funzione che mi consente di farlo?
Sfortunatamente, questo è un progetto scolastico che non mi è permesso usare execvp()
. Ho bisogno di implementare qualche funzione di ricerca del percorso e quindi aggiungere quel percorso del file al execv()
parametro.
risposte:
4 per risposta № 1Uso PATH = getenv("PATH")
per ottenere la stringa di percorso dall'ambiente, quindi utilizzare le chiamate successive a strtok(PATH,":")
poi strtok(NULL,":")
per analizzare i percorsi dal PATH
stringa in una matrice di char **path
, che dovrai allocare con malloc()
. Posto path[x]
+ "/"
+ argv[0]
in un buffer e utilizzare access(buffer, X_OK)
per vedere se puoi eseguire il tuo file in quel percorso, in tal caso, esegui il tuo execv(buffer,argv)
.
3 per risposta № 2
Se non puoi usare execvp, potresti ottenere la variabile PATH da char** environ
da <unistd.h> o char* getenv(const char* name)
da <stdlib.h> quindi utilizzare int access(const char* filename, int mode)
per vedere se il file esiste ed è eseguibile. Lascio a te l'implementazione perché è un progetto scolastico.
2 per risposta № 3
Volete execvp (), cercherà il percorso specificato nella variabile PATH a meno che il nome file non contenga un "/".
2 per risposta № 4
Alcune persone hanno suggerito di chiamare access()
o stat()
prima di tentare di eseguire il programma con execv()
. Non è necessario farlo. execv()
restituirà un errore se non è stato possibile eseguire il file richiesto.
1 per risposta № 5
Uso execvp
.
char *args[] = {"ls", (char *) NULL};
execvp("ls", args);
per esempio. questo esempio verrà eseguito /bin/echo
(supponendo /bin
è sul tuo PERCORSO).
#include <unistd.h>
int main()
{
char *args[] = {"echo", "hello world", (char *) NULL};
execvp("echo", args);
return 0;
}
1 per risposta № 6
Penso che execvp () faccia quello che ti serve.
Modificare: Quindi stai effettivamente chiedendo come farlo manualmente? In tal caso ...
- Trova il tuo PERCORSO in envp (terzo argomento a main ())
- Dividi questo in percorsi individuali
- Controlla l'esistenza del tuo programma in ognuno di questi con stat ()
- Esegui il primo che trovi esistente
O se vuoi un veramente implementazione solida, uso Questo. Potrebbe innescare i rilevatori di plagio :)
0 per risposta № 7
Dalla pagina man di execvp:
The functions execlp() and execvp() will duplicate the actions of the
shell in searching for an executable file if the specified filename
does not contain a slash (/) character. The search path is the path
specified in the environment by the PATH variable. If this variable
isn’t specified, the default path ‘‘:/bin:/usr/bin’’ is used. In addi-
tion, certain errors are treated specially.
Forse ti è permesso usare execlp ()? Se devi usare execv dovrai ottenere il valore della variabile d'ambiente PATH, analizzalo usando strtok () per ottenere i singoli percorsi, aggiungi il tuo nome file a ciascun percorso e prova ad eseguirlo con execv ().
Fornirei il codice, ma non sto facendo i compiti per te.
0 per risposta № 8
execvp
:-)
Modifica: ok. Ecco una versione di Perl, che può fungere da pseudocodice per il tuo problema.
use List::Util qw(first);
my @path = split /:/, $ENV{PATH};
my $dir = first {$_ ||= "."; -x "$_/$name"} @path
or die "Can"t find program $namen";
exec "$dir/$name", @args;
split
divide una stringa in una matrice di stringhe, usando il separatore specificato. first
trova il primo oggetto che soddisfa alcuni criteri; qui, che la concatenazione della directory e del nome ricercati è eseguibile (-x
). Quindi esegue quello.
Spero che sia d'aiuto!
-1 per risposta № 9
Oh un progetto scolastico ...
Beh, se vuoi qualcosa di "come quale" perché non solo exec "quale" stesso (/ usr / bin / che su Linux, non l'alias bash o built-in tcsh) per ottenere il percorso di ciò che stai cercando ...
:-)