2010-07-31 55 views
1

我有一個Perl程序和一個C程序。我想運行Perl程序並捕獲C程序的返回值。要清楚:Perl和外部程序

C程序(a.out的)

int main() 
{ 
    printf("100"); 
    return 100; 
} 

Perl程序:

print `ls`; #OK 
print `a.out`; #No error but it does not print any output. 

任何想法? 謝謝。

+5

對於你崇拜的任何神的愛,請告訴我們'a.out'不是你的C源文件:-)當你從命令行運行'a.out'時會發生什麼? – paxdiablo 2010-07-31 14:07:36

+0

我敢打賭它應該是'.a.out',因爲'。'通常不在PATH中。 – Borealid 2010-07-31 14:14:09

+0

'a.out'是已編譯的C程序,我也嘗試'./a.out'。 – user397232 2010-07-31 14:37:06

回答

2

我不知道perl的,但這個作品在我的系統上,因此無法保證:

#!/usr/bin/perl 

print "Running a.out now\n"; 
$exitCode = system("./a.out"); 
print "a.out returned:\n"; 
print $exitCode>>8; print "\n"; 

對於某種原因system()返回由8 bitshfted返回值(所以0將變成256,1將512 ... 7將是1792年或類似的東西),但我不在乎爲什麼。

+0

OP正試圖捕獲程序的輸出,而不是它的返回值。這就是反引起的。 – Ether 2010-07-31 16:26:56

+0

@Ether:我不知道,但我認爲他只是爲了簡潔而使用反引號,因爲他的問題是「我想運行Perl程序並捕獲C程序的返回值」。我猜他只是想要返回值。如果你有任何想法如何捕捉並且只運行一次,我會好奇的。 – 2010-07-31 17:00:11

+1

查看http://stackoverflow.com/questions/109124/how-do-you-capture-stderr-stdout-and-the-exit-code-all-at-once-in-perl – daotoad 2010-07-31 17:19:40

1

您的C程序不打印回車符,因此您可能會看到行緩衝問題。

試試這個:

printf("100\n"); 
0

系統()將返回指示你的C程序中返回,或者如果它是由一個信號終止的代碼;假設以後就不一樣了,你可以做

$exitcode = system('a.out'); 
print "return code was ", $exitcode >> 8, "\n"; 

如果您也想捕獲輸出,你可以使用反引號,代碼將在$?變量。

$output = `a.out`; 
$exitcode = $?; 
print "return code was ", $exitcode >> 8, "\n"; 
print "output was:\n", $output; 

您可能想要使用像IPC :: Cmd這樣的模塊,它具有您可能需要的其他功能。