我試圖使用 execve 來運行命令:ls -l /tmp,我熟悉系統呼叫的用法,但我不知道它是如何運行命令的。
我已經試過了,但我不斷收到錯誤
char *argv[] = {"ls", "-l", NULL};
int exec;
exec = execve("/tmp", argv, NULL);
printf("%d\n", exec);
return (0);
uj5u.com熱心網友回復:
你不使用execve正確使用。第一個引數必須是可執行路徑。
所以你的代碼應該是
int main(void) {
char *argv[] = {"ls", "-l", "/tmp", NULL};
execve("/bin/ls", argv, NULL);
// Or "/usr/bin/ls", depending where
// is stored 'ls' on your system
// On success theses lines are not reached
perror("execve failed");
return 0;
}
請注意(來自 man execve):
回傳值
成功時,execve() 不回傳,錯誤時回傳 -1,并設定 errno 以指示錯誤。
如果execve呼叫成功,您的程式將被啟動的程式(ls此處)替換,因此最后兩行將不會執行
uj5u.com熱心網友回復:
to 的第一個引數execve是要執行的程式的路徑。[1]
char *argv[] = { "ls", "-l", "/tmp", NULL };
execve( "/usr/bin/ls", argv, NULL );
請注意,我們必須提供二進制檔案的完整路徑。為了通過在需要時搜索 PATH 來避免這種情況,我們可以改用其中一個“p”變體。
char *argv[] = { "ls", "-l", "/tmp", NULL };
execvpe( argv[0], argv, NULL ); # execvpe is a GNU extension.
或者
char *argv[] = { "ls", "-l", "/tmp", NULL };
execvp( argv[0], argv );
最后,目的exec*是改變當前行程執行的程式。因此,它只在出錯時回傳,并且總是-1在出錯時回傳。如果你想列印錯誤,你可以使用perror.
- 要設定用作當前作業目錄的路徑,請使用
chdirbeforeexec*。
uj5u.com熱心網友回復:
的第一個引數execve必須是要執行的程式的路徑:
exec = execve("/bin/ls", argv, NULL);
第二個引數argv必須是所有引數的串列:
char *argv[] = {"ls", "-l", "/tmp", NULL};
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/533392.html
標籤:C壳Unix命令行执行
