o******1 发帖数: 1046 | 1 我用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程序中?
大牛们指点一下吧! |
m**k 发帖数: 290 | 3 能用python就别用perl了。
python 里有 subprocess.Popen
per里可以 open FD "| c-prog" |
o******1 发帖数: 1046 | 4 多谢提醒!
我试过了,命令里面的"|"应该是在"c-prog"之后吧。但是这也不行,还是不能把输出
返回给perl。
【在 m**k 的大作中提到】 : 能用python就别用perl了。 : python 里有 subprocess.Popen : per里可以 open FD "| c-prog"
|
G*****h 发帖数: 33134 | 5 $s = `c-prog`;
Print $s;
这行不? |
f*****3 发帖数: 19 | 6 你的c 语言输出是到STDOUT吗?
试试这个看输出是到STDOUT,或STDERR:
perl code.pl 1> out.txt 2> err. txt |
w***g 发帖数: 5958 | 7 1. 先确保是否真的写到了stdout,单独运行perl cgi的时候用 > xxx看你要的输出有
没有重定向到xxx里面。
2. 换一个目录运行perl cgi看是不是还正确。apache调用cgi的时候目录可能和你用的
不一样。
3. 用sudo执行perl cgi,看是不是还是正确。apache调用你的程序会用apache/www/
www-data类似的用户名调用。你可以su到该用户运行一下看是否正确。
4. 看apache的错误日志, /var/log/apache2/error.log。
perl
【在 o******1 的大作中提到】 : 我用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的输
|
o******1 发帖数: 1046 | 8 多谢上面的大牛们的指点!费了一个晚上终于找出来毛病了。但是我还有个问题,大牛
们请继续帮忙。
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环
境变量全部输入进来?
谢谢啦! |
f*****3 发帖数: 19 | 9 shell 变量一般在 ~/.bash_profile.如果不是你可以自己建立个文件。
==
export LD_LIBRARY_PATH=...
...
==
把你的c 程序放在已shell script 里面。
===
#!/bin/bash
source /home_dir/.bash_profile
/home_dir/bin/c_prog
===
再用Perl调用。 |
o******1 发帖数: 1046 | 10 多谢指点!
不过下面的这个方法似乎也不行
===
#!/bin/bash
source /home_dir/.bash_profile
/home_dir/bin/c_prog
===
按照你说的,先把两个变量export到$HOME/.bash_profile中(我还export到$HOME/.
bashrc以及source了.bashrc)。然后script中的source之后多加了两行,一行
是echo "world",另一行是echo "$LD_LIBRARY_PATH",前一个显示了,后一个没有。
当然C的output也不显示。
【在 f*****3 的大作中提到】 : shell 变量一般在 ~/.bash_profile.如果不是你可以自己建立个文件。 : == : export LD_LIBRARY_PATH=... : ... : == : 把你的c 程序放在已shell script 里面。 : === : #!/bin/bash : source /home_dir/.bash_profile : /home_dir/bin/c_prog
|
|
|
G*****h 发帖数: 33134 | 11 运行 cgi 的那个系统用户跟你自己的用户不一样
【在 o******1 的大作中提到】 : 多谢指点! : 不过下面的这个方法似乎也不行 : === : #!/bin/bash : source /home_dir/.bash_profile : /home_dir/bin/c_prog : === : 按照你说的,先把两个变量export到$HOME/.bash_profile中(我还export到$HOME/. : bashrc以及source了.bashrc)。然后script中的source之后多加了两行,一行 : 是echo "world",另一行是echo "$LD_LIBRARY_PATH",前一个显示了,后一个没有。
|
o******1 发帖数: 1046 | 12 运行cgi的就是我自己的一个perl文件。奇怪的是perl不认shell的环境变量。甚至做了
如feng443所建议的,用一个shell script做container来装C可执行程序,并且在这个
shell script中包括#!/bin/bash以及source用户配置文件也不行。我还试过,哪怕是
echo $HOME都不打印。
难道告诉perl程序环境变量,只有用$ENV{}这样的一个一个的手动载入?有没有更
elegant的办法啦?
【在 G*****h 的大作中提到】 : 运行 cgi 的那个系统用户跟你自己的用户不一样
|
f*****3 发帖数: 19 | 13 try this:
system('/path/code'); |
G*****h 发帖数: 33134 | 14 文件是你的
运行这个文件的进程是 httpd 调用 perl
用的是 httpd 系统用户的环境变量
【在 o******1 的大作中提到】 : 运行cgi的就是我自己的一个perl文件。奇怪的是perl不认shell的环境变量。甚至做了 : 如feng443所建议的,用一个shell script做container来装C可执行程序,并且在这个 : shell script中包括#!/bin/bash以及source用户配置文件也不行。我还试过,哪怕是 : echo $HOME都不打印。 : 难道告诉perl程序环境变量,只有用$ENV{}这样的一个一个的手动载入?有没有更 : elegant的办法啦?
|
o******1 发帖数: 1046 | 15 多谢指点!
我试着在那个shell script中echo几个apache2的环境变量,比如$APACHE_RUN_DIR和$
APACHE_RUN_GROUP,还是没有打印出来。
也许httpd的系统用户环境变量我没有找对。我是在/etc/apache2/envvars中找的。如
果不对,应该在哪个文件中?
谢谢啦!
【在 G*****h 的大作中提到】 : 文件是你的 : 运行这个文件的进程是 httpd 调用 perl : 用的是 httpd 系统用户的环境变量
|
o******1 发帖数: 1046 | 16 多谢指点!
这个开始就试过了。system()跟``不同,不是把里面的命令的stdout输出,而是执行一
下命令,再把exit status输出,所以返回的结果是0或者1。有点相似的还有exec(),
这个干脆就光执行命令,什么也不返回。
【在 f*****3 的大作中提到】 : try this: : system('/path/code');
|
G*****h 发帖数: 33134 | 17 有个简单的 env.cgi 之类的例子
把 cgi 环境的所有变量都显示到网页上看的
【在 o******1 的大作中提到】 : 多谢指点! : 这个开始就试过了。system()跟``不同,不是把里面的命令的stdout输出,而是执行一 : 下命令,再把exit status输出,所以返回的结果是0或者1。有点相似的还有exec(), : 这个干脆就光执行命令,什么也不返回。
|