2010-07-31 54 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这样的模块,它具有您可能需要的其他功能。