请教一个system调用

发布于 2022-07-16 14:32:24 字数 1362 浏览 6 评论 2

有一个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

潜移默化 2022-07-23 09:58:00

原帖由 mq110 于 2006-5-9 16:51 发表
fork一个子进程,用子进程 调用execve系列函数.

说的有理
如果你有一个应用程序一直执行

  1. while(1)
  2. {
  3. /*
  4. do something
  5. */
  6. }

复制代码
的话,直接用chkconfig把它加进去,在系统启动的时候,整个界面会阻塞住,因为应用程序没有返回
解决办法:

  1. /*
  2. 父进程
  3. */
  4. if(fork() == 0)
  5. {
  6.    system("./a.out");
  7.   exit(0);
  8. }else
  9. {
  10. /*
  11. sleep some time so that the user can see the ppid's changing from
  12. some value to 1(the pid of process init) when parent process exits
  13. by cat /proc/"pid of this process"/status
  14. */
  15. exit(0);
  16. }

复制代码
父进程在创建完子进程后先把它交给init去"抚养",然后自己就孤独的死掉了,从而init就是他的"继父"了,因为这样做的话可以使得子进程在退出的时候进程描述符得到回收(没有父进程的话它会僵死的,从而资源不能释放)
可以写一个简单的例子看看(进入/proc/子进程PID/,cat status文件来查看)子进程的ppid在父进程退出后变成1了,那就是init的pid

[ 本帖最后由 duanjigang 于 2006-5-9 22:40 编辑 ]

无言温柔 2022-07-21 18:19:18

fork一个子进程,用子进程 调用execve系列函数.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文