popen和pclose中的不同行为

最近,当我使用popen(3)pclose(3)时候,我遇到了一个奇怪的问题。 像这样:

 //a.sh #!/bin/bash cat /etc/issue sleep 3 //b.sh #!/bin/bash cat /etc/issue echo "before sleep" sleep 3 

我的C程序:

 #include <stdio.h> int main(void) { 1: FILE *fl = popen("sh a.sh", "r"); 2: FILE *fl = popen("sh b.sh", "r"); int t = pclose(fl); printf("%d\n", t); return 0; } 

接下来,我将按照以下4个步骤来编译和运行这个程序:

情况1:注释行2,然后编译并运行,程序不打印0直到shell cmd终止。

情况2:注释行1,然后编译并运行,程序将立即终止并打印13,也就是说pclose的退出状态是13,我pclose了一下linux errno:

 13 EACCES +Permission denied 

同一个人会帮助我,并告诉我的原因? 谢谢。

您应该使用WEXITSTATUS宏来获取真正的返回码。