/ / ricerca percorso unix C funzione [chiuso] - c, unix, percorso

funzione di ricerca percorso unix C [chiuso] - c, unix, percorso

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 № 1

Uso 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 ...

  1. Trova il tuo PERCORSO in envp (terzo argomento a main ())
  2. Dividi questo in percorsi individuali
  3. Controlla l'esistenza del tuo programma in ognuno di questi con stat ()
  4. 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 ...

:-)