簡體   English   中英

“在路徑中查找命令”是什么意思?

[英]What does it mean to “find a command in a path”?

這是我的作業課上我的操作系統課的摘錄。 粗體部分是我無法理解的部分,我現在也無法聯系到教授,我真的很想今晚開始。 我想我知道什么是環境變量...只是在shell中聲明的變量,對吧? 但是,粗線特別意味着什么?

編寫一個C程序來實現一個交互式外殼,用戶可以在其中執行命令。

將此程序稱為myshell(因此請使用gcc -o myshell -Wall等進行編譯)。

創建一個無限循環,該循環反復提示用戶輸入命令(請參見下面的示例輸出和輸入)。

在執行用戶輸入的命令之前,必須使用環境變量THEPATH指定的路徑找到該命令(不要使用PATH!)。 默認情況下,THEPATH變量未設置,因此,為了進行測試,您需要手動設置(和取消設置)此變量(請參見下面的詳細信息)。 如果找到了THEPATH,則您的程序必須通過fork()和exec()系統調用之一在子進程中執行命令。

要獲取和解析THEPATH,請考慮使用getenv()函數和strtok()或strsep()函數。

要讓外殼程序運行程序,它必須知道該程序在哪里。 例如,您希望能夠在提示符下鍵入ls ,但是ls的實際二進制文件可能位於/bin/ls 這就是PATH (或您的情況, THEPATH )的輸入。當您輸入ls ,shell將關閉並在每個PATH目錄中查找具有匹配名稱的程序。 當找到一個時,它將運行它。 讓我們以ls為例,並將PATH設置為:

/usr/local/bin:/usr/bin:/bin

假設ls/bin/ls ,那么外殼程序首先在/usr/local/bin查找ls ,沒有找到它,然后在/usr/bin查找,最后在/bin找到並執行它。

實際上, 執行此操作是您的分配中有關getenvstrtokstrsep的提示的地方。

您的變量THEPATH應該包含目錄列表,以冒號分隔,如

THEPATH=/usr/bin:/bin:some-other-dirs

您必須將其解析為目錄列表。 用戶輸入命令時,必須掃描所有目錄,以查找名稱與用戶輸入的命令匹配的可執行文件。

以這種復雜程度編寫外殼程序不是一個初學者的任務,如果您不了解系統的PATH處理如何工作(您只是在模仿外殼程序的功能),那么您可能會頭疼。

我知道我來晚了,但是您可以本着Foo大師的“不編碼就可取功”的精神在這里打個dirty頭。 execlp()execvp()execvpe() C庫函數實際上為您搜索PATH變量。 您要做的就是在環境中用THEPATH替換PATH。 它也使您的外殼更安全,因為所有子進程都將使用原始的THEPATH作為PATH。

int i_path = -1;
int i_thepath = -1;
int i = 0;
while (envp[i] != NULL) {
    if (strstr(envp[i], "PATH=") == envp[i])
        i_path = i;
    if (strstr(envp[i], "THEPATH=") == envp[i])
        i_thepath = i;
    i++;
}
if (i_path >= 0 && i_thepath >= 0)
    envp[i_path] = envp[i_thepath] + 3; /* discard 'THE' */
else if (i_thepath >= 0)
    envp[i_thepath] = envp[i_thepath] + 3; /* discard 'THE' */
execvpe(command, argv, envp);

如果要手動解析THEPATH,請不要創建目錄列表。 在像Perl這樣的高級語言中,這很容易,但是涉及到用C進行手動動態內存分配,因為您事先不知道THEPATH中有多少個dir元素。 要進行內存分配,您需要首先遍歷字符串。 但是,您可以使用strtok()":"作為分隔符strtok()在第一次迭代中完成實際工作。

char *thepath = envp[i_thepath];
char *dir;
strtok(thepath, "="); /* first discard 'THEPATH=' */
while (dir = strtok(NULL, ":") {
    /* now check if dir+command exists and is execuatble, exec */
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM