2013-12-16 64 views
0

最近,當我使用popen(3)pclose(3)時,出現了一個奇怪的問題。就像這樣:popen和pclose中的差異行爲

//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,然後編譯並運行,程序在shell cmd終止之前不打印0。

的情況下2:註釋行1,然後編譯並運行,程序會馬上終止,並將其打印13,這就是說的pclose退出狀態是13,我看到了Linux的錯誤號:

13 EACCES +Permission denied 

同體會幫助我,並告訴我的原因?謝謝。

+1

'pclose'返回子進程的退出狀態,而不是'errno.h'錯誤值。 –

+0

謝謝,我將使用WEXITSTATUS宏和WIFEXITED宏 – yuxing

回答

1

您應該使用WEXITSTATUS宏來獲取真實的返回碼。

+0

謝謝。我使用WEXITSTATUS宏,它返回0.是否表示這個plose是正確的?但是,爲什麼不等待shell終止? – yuxing

+0

你也使用過WIFEXITED嗎?請閱讀W ...宏的完整手冊頁:http://linux.die.net/man/2/wait – pts

+0

同意,您應該顯示所有W ..宏的返回以獲得有關您的更多信息子進程。 – jml