请教一个system调用
有一个CGI程序中system调用脚本的小问题,还希望哪位大哥帮帮九贱!!!!
我有一个控制pptpd的脚本
/etc/rc.d/init.d/pptpd
#启动pptpd
case "$1" in
start)
/sbin/pptpd -n & > /dev/null 2>&1
;;
……
然后我在CGI程序里边调用这个脚本:
void ctl_process(int opt,int id)
{
system("/etc/rc.d/init.d/pptpd start");
}
可是在WEB界面里运行到这里的时候,就像是CGI程序进入了死循环,一运行ps:
257 root 1628 S /sbin/mini_httpd -D -C /etc/mini_httpd_config
258 root 1628 S /sbin/mini_httpd -D -C /etc/mini_httpd_config
260 root 528 S N /sbin/pptpd -n
进程257应该是我CGI程序,258是system产生的子进程,260表示pptpd已经被调用了,但是257/258就一直挂在这里,没有结束,这是为什么呀??
以前在C/C++版块问过这个问题,当时一位朋友的解释
“/bin/pptpd本身是个常驻进程
你的进程去system调用/bin/pptpd的时候,system肯定要等待pptpd返回值啊。虽然你加了一个&抛在后台执行,这只不过是进程不显式运行,但是其父进程还是你的进程,我测了一下,system调用的时候,加
nohup /bin/pptpd &
这样可以把/bin/pptpd的父进程变成了系统进程。你的进程可以正常退出”
——可是,我在Console下,一执行pptpd,进程就运行并立即返回了,应该不是这个原因喔!!!
求教!!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
说的有理
如果你有一个应用程序一直执行
复制代码
的话,直接用chkconfig把它加进去,在系统启动的时候,整个界面会阻塞住,因为应用程序没有返回
解决办法:
复制代码
父进程在创建完子进程后先把它交给init去"抚养",然后自己就孤独的死掉了,从而init就是他的"继父"了,因为这样做的话可以使得子进程在退出的时候进程描述符得到回收(没有父进程的话它会僵死的,从而资源不能释放)
可以写一个简单的例子看看(进入/proc/子进程PID/,cat status文件来查看)子进程的ppid在父进程退出后变成1了,那就是init的pid
[ 本帖最后由 duanjigang 于 2006-5-9 22:40 编辑 ]
fork一个子进程,用子进程 调用execve系列函数.