簡體   English   中英

在C中的參數中使用帶有shell元字符的execlp系統調用

[英]Using execlp system call with shell metacharacters in the arguments in C

程序:使用execlp()系統調用列出當前文件夾中的所有C文件:

#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("Before Execl\n");
    execlp("ls","ls","*.c",NULL); // this should print all c files in the current folder.
    return 0;
}

節目輸出:

Before Execl
ls: cannot access *.c: No such file or directory

每當我在搜索模式中使用' * '時,我都會遇到類似的錯誤。 請提出一些適當的解決方案

如果要擴展shell元字符,請調用shell以展開它們,因此:

execlp("sh", "sh", "-c", "ls *.c", (char *)0);
fprintf(stderr, "Failed to exec /bin/sh (%d %s)\n", errno, strerror(errno));
exit(EXIT_FAILURE);

請注意,如果execl()或任何exec*函數返回,則失敗。 你不需要測試它的狀態; 它失敗了。 你不應該exit(0); (或return 0;main()函數中),因為它表示成功。 包含錯誤信息概述錯誤信息是有禮貌的,並且應該將消息寫入stderr ,而不是stdout - 如圖所示。

你可以自己做元字擴展; POSIX庫中有函數可以幫助(例如glob() )。 但是讓shell執行它更簡單。

(我修改了上面的代碼,使用execlp()來符合問題的要求。如果我這樣做不受約束,我可能會使用execl()並指定"/bin/sh"作為第一個參數。)

Exec不處理“ * ”運算符,因為shell會為您執行此操作。 為此使用popen()glob_t 您可以獲得我在2012-03-08提出的類似問題的更多詳細信息。

應該是:

   execlp("ls", "*.c", NULL);
execlp("ls", "*.c", NULL);

應該管用

暫無
暫無

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

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