您好我正在嘗試使用execv分叉子行程中的函式來執行終端中的命令,例如:ls、、、等等。但是,,有效,但是,和其他東西無效,失敗回傳。的輸入是和, 。例如,當我輸入時,它在 t.txt 中列印出 3 個數字,其中包括 5,并列印出目錄中的每個檔案。為什么只有和作業和其余的命令沒有?grepsortawklsgrepsortawkexecv-1argv"sort t.txt"stdinargv[0]=sortargv[1]=t.txtgrep 5 t.txtlslsgrep
char* command(char** argv) {
char* ptr = malloc(200);
if (!strcmp(argv[0], "ls") || !strcmp(argv[0], "man") || !strcmp(argv[0], "grep")
|| !strcmp(argv[0], "sort") || !strcmp(argv[0], "awk") || !strcmp(argv[0], "bc")) {
sprintf(ptr, "/bin/%s", argv[0]);
}
return ptr;
}
//inside fork=
char* pos = command(argv);
if (execv(pos, argv) < 0) {
printf("%s\n", argv[0]);
if(argv[1]!=NULL)
printf("%s\n", argv[1]);
if(argv[2]!=NULL)
printf("%s\n", argv[2]);
perror("execv");
fprintf(stderr, "%s: Command not found.\n", argv[0]);
free(pos);
exit(0);
}
free(pos);
mini> sort t
sort
t
execv: No such file or directory
sort: Command not found.
mini> ls
Makefile minishell.c pa2 t
mini>
uj5u.com熱心網友回復:
問題是因為您對要在 中找到的命令進行了硬編碼/bin/,而某些命令(如sort命令)不在該位置(sort通常在 中/usr/bin/)。
要解決該問題并能夠在標準路徑中使用任何execvp命令,請改用:
execvp(argv[0], argv);
不同的execv是,execvp它將使用環境變數PATH來搜索命令。
有關不同版本的詳細資訊,exec請閱讀家庭手冊頁。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/532241.html
標籤:Clinux
