eseguire con ricerca di percorso?

Voglio eseguire un programma dal mio codice e fornirlo con variabili e argomenti di ambiente. AFAICT, execve è la scelta giusta.

Ma execve riceve un argomento di path , non un filename , il che significa che si aspetta che il primo argomento sia un percorso dell’eseguibile.

So di poter analizzare me stesso $PATH per trovare il percorso, ma in realtà non c’è altra scelta? Nessun altro l’ha implementato da qualche parte per me da usare?

Alcuni sistemi possono fornire execvpe() . Una ricerca su Google per “execvpe” mostra una varietà di opzioni, inclusa almeno un’implementazione (considerevolmente più complessa di quanto segue, ma include la maggior parte di execvp() nel proprio codice).

Per quelli che non lo fanno, puoi fornirtelo tu stesso:

 int execvpe(const char *program, char **argv, char **envp) { char **saved = environ; int rc; environ = envp; rc = execvp(program, argv); environ = saved; return rc; } 

Probabilmente potresti sopravvivere senza rc (solo restituendo forzatamente -1) poiché execvp() restituisce sempre -1 (e restituisce sempre e solo un errore).

Probabilmente non devi nemmeno preoccuparti della sicurezza dei thread in questo codice. Lo scenario normale che lo userà è subito dopo un fork() e, a quel punto, c’è solo un thread nel processo. Se pensi di poterlo utilizzare quando ci sono più thread in giro, allora devi pensare piuttosto attentamente se è sicuro modificare l’ambiente globale anche se brevemente. Chiaramente, se execvp() positivo, non ci sarà un problema (tutti i thread verranno interrotti bruscamente). Se execvp() fallisce, allora forse uno degli altri thread vedrebbe l’ambiente modificato e potrebbe prendere decisioni sbagliate basandosi su questo. In tal caso, è necessario proteggere l’ambiente in modo appropriato (e questo probabilmente implica il blocco (mutua esclusione) in getenv() , setenv() e putenv() così come in execvpe() ).

(L’implementazione di execvpe() che ho trovato evita i problemi di sicurezza del thread implementando la logica execvp() e quindi usando execve() per eseguire il programma.)

Normalmente, se execvpe() restituisce, il processo uscirà, quindi molto spesso il ripristino dell’ambiente non influenzerà il programma. Tuttavia, è meglio prevenire che curare.