由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Linux版 - perl cgi中调用C可执行程序为什么在html中不显示?
相关主题
编写支持CGI的web服务器大致原理怎么从script中把环境变量传回到当前shell中?
stdout/stderr redirect请问tcsh里如何将环境变量临时改变且传递给一个命令?
求教:如何attach to 一个后台进程请教 GNU Screen display 的问题
请问bash下 > 和 >&有啥区别怎样在环境变量里加换行符?
我的home server[请问]如何在script中设置环境变量
/etc/passwd 里面没有user ids?Xming 问题
请教个简单命令问题请教一个linux下面matlab的问题
如何在configure 中指定环境变量哪位大牛来普及一下 linux 下面的各种环境变量以及设置
相关话题的讨论汇总
话题: perl话题: 调用话题: cgi话题: 程序话题: stdout
进入Linux版参与讨论
1 (共1页)
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

相关主题
/etc/passwd 里面没有user ids?怎么从script中把环境变量传回到当前shell中?
请教个简单命令问题请问tcsh里如何将环境变量临时改变且传递给一个命令?
如何在configure 中指定环境变量请教 GNU Screen display 的问题
进入Linux版参与讨论
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(),
: 这个干脆就光执行命令,什么也不返回。

1 (共1页)
进入Linux版参与讨论
相关主题
哪位大牛来普及一下 linux 下面的各种环境变量以及设置我的home server
装了ubuntu 8.10,但是sudo apt-get insall不work/etc/passwd 里面没有user ids?
高人帮我看看一个简单的script,为什么nohup有问题?请教个简单命令问题
【问题】怎么知道apt-get都往Linux里写入了哪些文件如何在configure 中指定环境变量
编写支持CGI的web服务器大致原理怎么从script中把环境变量传回到当前shell中?
stdout/stderr redirect请问tcsh里如何将环境变量临时改变且传递给一个命令?
求教:如何attach to 一个后台进程请教 GNU Screen display 的问题
请问bash下 > 和 >&有啥区别怎样在环境变量里加换行符?
相关话题的讨论汇总
话题: perl话题: 调用话题: cgi话题: 程序话题: stdout