作者WalkingIce (会走路的冰块)
看板perl
标题Re: [问题] cgi如何以背景执行一个外部程式
时间Sat Jun 23 09:16:41 2007
※ 引述《jlovet (你这可恶的骗子)》之铭言:
: 标题: Re: [问题] cgi如何以背景执行一个外部程式
: 时间: Sat Jun 23 01:36:44 2007
:
:
: man 2 fork
: * The child inherits copies of the parent's set of open file descrip-
: tors. Each file descriptor in the child refers to the same open
: file description (see open(2)) as the corresponding file descriptor
: in the parent. This means that the two descriptors share open file
: status flags, current file offset, and signal-driven I/O attributes
: (see the description of F_SETOWN and F_SETSIG in fcntl(2)).
:
: 我想应该是因为这个关系吧
:
: 因为在你的Perl执行system之前有打开了档案 (就是输出到你网页上的...)
: 这个file handle 被system执行的东西继承了...
:
: 所以...在你child 结束之前,这档案都是保持打开状态
: 恩...就这样
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 140.123.235.194
: 推 megaman1206:谢谢 所以说STDOUT先关的做法是没错的了orz 06/23 06:28
我只写过 Hello CGI 之流的东西,纯粹是用猜测,不知道可不可以给一点帮助
就你之前所说的:
「我想让A程式呼叫B程式之後马上显示提示讯息然後网页就不继续读取
.......
我之後就改成先输出讯息之後关闭STDOUT才执行B程式
这样虽然流程很怪可是却成功了」
那我猜测是:关闭 STDOUT 之後,网页就不会再继续读取
(你可以在程式里面加个 sleep 去测试看看是不是真的这样
我也懒得架个 CGI 的环境,哈哈哈 XD )
如果真的是这样....
http://0rz.tw/0d2Lj [注] 有提到
The following file handles are open by default:
STDOUT - Standard Output,for regular use output, typically the screen
STDOUT 这个 File Handler 预设就会被打开。
[注]:
http://www.wellho.net/mouth/255_STDIN-STDOUT-STDERR-and-DAT
A-Perl-file-handles.html
而 fork 这个函式 (在 Perl 里面应该不能算是 System Call ?!)
就是拷贝出一个一模一样的 Process
也就是说当你在 A 里面用 fork 的时候
执行完 fork 这一行会有两个 A (Dobule A?!)
而这两个的 File Descriptor, 程式,变数...等等都会完全相同
不同的只有他们的 Process ID
程式一开始执行就打开了 STDOUT, fork 之後就有两支 Process 打开 STDOUT
只有一支 Process 关掉 STDOUT,当然不会让网页停止读取
如果真的是「关掉 STDOUT 网页就会停止读取」
那麽按照你的需求,输出後关掉 STDOUT 再执行 B 就可以了。
而且也不需要用到 fork :P
下台一鞠躬...(跑)
--
(观众丢食物上台)
--
我想你会衰成这样都是我害的
---- Tizzy Mac
紧张的麦金塔?这是谁(._.?)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.128.98.6
1F:推 qrtt1:还有 nohup 啊 :D 06/23 11:03
2F:推 WalkingIce:nohup 我没用过XD..Q 桑出现了 (拜) 06/23 11:13
3F:推 megaman1206:感谢大家 学到不少东西m(_ _)m 06/23 17:10