2012-11-10 38 views
0

我想在我的C程序中執行其他程序。我第一次嘗試是用popen。當我嘗試從pipe讀取時,我只收到1個字節的回覆,而且buf中沒有任何內容。我不確定這背後的原因。Popen和execl不給出用戶定義的程序的輸出

POPEN例如:

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

int main(int argc, char* argv[]) 
{ 
     FILE* pipe; 
     if ((pipe=(FILE*)popen("./test.php","r"))==NULL) 
       printf("this is not working\n"); 
     char buf[1024] = {'\0'}; 

     int fd=fileno(pipe); 

     int bytes = read(fd, buf, 1024); 

     printf("bytes read %d\n", bytes); 

     printf("The program: %s\n", buf); 
     if(pclose(pipe)<0) 
       printf("not working\n"); 
     return 0; 
} 

PHP示例

#!/usr/bin/php 

<?php 
echo "THIS IS A TEST THAT WORKED\n"; 
?> 

輸出:

bytes read 1 
The program: 

LS的輸出:

ls -l test.php 
-rwxr-xr-x+ 1 tpar44 user 62 Nov 10 14:42 test.php 

任何幫助,將不勝感激! 謝謝!

+0

仍然沒有看到任何問題,請問您可以添加輸出嗎? – iabdalkader

+0

@mux我也沒有,這就是爲什麼我現在很困惑 – tpar44

+0

這可能看起來很愚蠢,但你重新編譯的代碼:)? – iabdalkader

回答

2

您需要使用popen時,如果您的腳本做有家當因爲shell將不知道使用哪種解釋器來執行PHP解釋器,並通過腳本作爲參數,名稱:

fp = popen("php /path/to/script/test.php", "r"); 

如果腳本有家當線你可以執行它,因爲popen用來執行命令的外殼,它可以找出哪一個使用,所以你可能只是這樣做:

fp = popen("/path/to/script/test.php", "r"); 

但是,請確保該腳本是可執行的:

chmod +x test.php 

你也可以使用execl()但你必須到指定的二進制文件的路徑,因爲execl不使用shell:

execl("/usr/bin/php", "/usr/bin/php", "-q", 
     "/path/to/script/test.php", (char *) NULL); 

唐忘了實際上從管道上讀取數據)

fread(buf, 1, 1024, pipe); 
+0

哦!當shebang被列爲第一行時,這甚至是真的嗎? – tpar44

+0

@ tpar44這將執行php解釋器的腳本,它會忽略第一行,如果你希望你可以用bash執行它,它將運行php。 – iabdalkader

+0

@ tpar44檢查更新 – iabdalkader

相關問題