方案:使用列表中execlp()
系統調用在當前文件夾中的所有C文件:使用execlp與參數shell元字符用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
每當我使用'*
'在搜索模式中,我收到了類似的錯誤。請提出一些合適的解決方案
請注意,如果你在調用'execlp'之前分叉了,那麼在孩子中使用'stdio'操作可能是錯誤的,除非你確定(1)程序是單線程的,(2)孩子的副本'stderr'(或者你正在使用的'FILE')有資格成爲「活動句柄」(參見POSIX XSH 2.5.1)。就我個人而言,我會避免在'fork'之後使用非異步信號安全函數,它也包含'exit';改用'_Exit'。 – 2012-03-09 07:40:33
[XSH§2.5.1](http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_05)是一種複雜的說法:「如果你編程正常,你會沒事的」。特別是,'stderr'通常是無緩衝的,並且在第三個項目符號上得到了「不需要採取任何操作」。 – 2012-03-09 15:02:31
通常沒有緩衝的是一個實現細節。我記得,標準只是說它不應該被默認完全緩衝,所以'stderr'行默認緩衝可能符合實現,可能會顯着提高性能。如果你打算在分叉之後在父母和孩子中使用它,我會在分叉之前調用'fflush(stderr)',爲了安全起見...... – 2012-03-09 16:48:35