o******1 发帖数: 1046 | 1 【 以下文字转载自 Linux 讨论区 】
发信人: outlook1 (outlook1), 信区: Linux
标 题: perl cgi中调用C可执行程序为什么在html中不显示?
发信站: BBS 未名空间站 (Sat Apr 12 02:23:45 2014, 美东)
我用perl写一个cgi的程序,其中调用了自己写的C程序(binary executable),需要
其stdout,所以用的是backticks。
如果单独运行perl cgi,结果正常,所有该print出来的全部出现,包括调用的C程序的
output。但是一旦从html里面连接到这个perl cgi,C程序ouput的部分,在网页中不显
示。
我试着把调用C程序的部分改成调用Linux系统程序,比如ls,cat等等,其output在网
页中就正常出现了。
我很困惑,大概知道是因为C程序的output没有被返回到perl process里面。但是在单
独执行perl程序的时候,调用的C就正常的输出到stdout了。又想了一想,可能是perl
和C共享了屏幕显示,所以我分辨不出来。但是在运行perl程序的时候,被调用的C的输
出没有返回到perl process,而是在另一个过程中,所以cgi创建的新网页就不显示了
。但是对于调用的Linux系统程序,为什么能正确的返回呢?
我半路出家,没学过操作系统,对于process,thread这些概念一知半解。大牛们能不
能指点一下,如何设置,才能让C程序的stdout返回到perl中?
多谢啦! |
o******1 发帖数: 1046 | 2 上面说的太啰嗦了,我想了一下,其实问题就一句话:
如何把backticks中调用的自己写的C可执行程序的output返回到perl程序中?
大牛们指点一下吧! |
p*****u 发帖数: 225 | |
e*******o 发帖数: 4654 | |
o******1 发帖数: 1046 | 5 多谢上面的大牛们的指点!费了一个晚上终于找出来毛病了。但是我还有个问题,大牛
们请继续帮忙。
1. 我的那个c的可执行文件是从oracle数据库里面retrieve东西,然后打印到stdout。
2. 我的问题其实不是C可执行文件的stdout没有返回到perl,而是C没有从数据库里面
retrieve到东西。所以先纠正一下之前我的错误,不管是用backticks,还是open
filehandle "C-proc |",都是返回了的。
3. 我是这样fix了原先的问题的:在perl文件中,加入了两行环境变量的设置,i.e. $
ENV{'LD_LIBRARY_PATH'} = '...'; 和$ENV{'ORACLE_HOME'} = '...'; 之后就没问题
了。
4. 那个C可执行文件在command line直接运行是没有问题的,也就是说
shell知道环境变量$LD_LIBRARY_PATH和$ORACLE_HOME的值。但是在perl文件的
backticks中执行,这两个环境变量是空白的。
5. 我的新问题是:在编程语言中,有没有一个简单的方法,一次性的把所有的shell环
境变量全部输入进来?
谢谢啦! |
e*******o 发帖数: 4654 | 6 perl -E 'say for %ENV'
把这个结果导入到你的cgi script? |
e*******o 发帖数: 4654 | 7 或者 parse bashrc file,把 环境变量 都提取出来? 我没搞过,仅供参考。 |
o******1 发帖数: 1046 | 8 多谢指点!
这个应该可以。就是要修饰一下perl -E 'say for %ENV'输出的格式。直接输出,就是
一行变量名,接着一行变量值,perl似乎不认。
【在 e*******o 的大作中提到】 : perl -E 'say for %ENV' : 把这个结果导入到你的cgi script?
|
o******1 发帖数: 1046 | 9 这个似乎比较困难。。。
【在 e*******o 的大作中提到】 : 或者 parse bashrc file,把 环境变量 都提取出来? 我没搞过,仅供参考。
|
e*******o 发帖数: 4654 | 10 可以直接输出 %ENV hash.
我这个只是提醒你%ENV 的作用。
perl -MData::Dumper -E 'say Dumper(\%ENV)'
【在 o******1 的大作中提到】 : 多谢指点! : 这个应该可以。就是要修饰一下perl -E 'say for %ENV'输出的格式。直接输出,就是 : 一行变量名,接着一行变量值,perl似乎不认。
|
e*******o 发帖数: 4654 | 11 如果不想手动搞,我觉得这也是个办法。
regex 匹配几下不就出来了么。
【在 o******1 的大作中提到】 : 这个似乎比较困难。。。
|
o******1 发帖数: 1046 | 12 多谢!
这么做似乎可以,就是在C程序中的参数个数(argc)数不对了。下面是perl程序中加
入的%ENV hash:
"
%ENV = (
'QTINC' => '/usr/lib64/qt-3.3/include',
'SSH_ASKPASS' => '/usr/libexec/openssh/gnome-ssh-askpass',
'ORACLE_HOME' => '/home/oracle/app/oracle/product/11.2.0/dbhome_1',
'CVS_RSH' => 'ssh',
'J2EE_HOME' => '/usr/local/jdk1.7.0_03',
...
);
"
当然了,%ENV中包含手动定义的几个环境变量,而且key和value都是正确的。
调用C程序的语句是:$ret = `C_prog $para`; C-prog包括绝对路径和文件名。如果
把上面定义%ENV的整个语句comment掉,还使用原先手动定义几个环境变量,结果就对
了。
看上去%ENV的定义挺正确的,不知道怎么就出现这么奇怪的argc数不对的错误?
【在 e*******o 的大作中提到】 : 可以直接输出 %ENV hash. : 我这个只是提醒你%ENV 的作用。 : perl -MData::Dumper -E 'say Dumper(\%ENV)'
|
e*******o 发帖数: 4654 | 13 看一看你原来的%ENV 是啥。
你override原来的%ENV了。
应该merge 两个hash,不过要关注下冲突的问题。
1',
【在 o******1 的大作中提到】 : 多谢! : 这么做似乎可以,就是在C程序中的参数个数(argc)数不对了。下面是perl程序中加 : 入的%ENV hash: : " : %ENV = ( : 'QTINC' => '/usr/lib64/qt-3.3/include', : 'SSH_ASKPASS' => '/usr/libexec/openssh/gnome-ssh-askpass', : 'ORACLE_HOME' => '/home/oracle/app/oracle/product/11.2.0/dbhome_1', : 'CVS_RSH' => 'ssh', : 'J2EE_HOME' => '/usr/local/jdk1.7.0_03',
|