免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2803 | 回复: 11
打印 上一主题 下一主题

请教关于fork的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-17 22:32 |只看该作者 |倒序浏览
用perl写cgi,想在用户提交表单后马上返回一个通知页面,然后当父进程运行结束时发邮件给用户。
用fork产生子进程,完成第一个任务:输出通知页面。

始终是在等待父进程结束,结果每次http都是返回500的错误,但是父进程是可以做完的。

请教高手这可能是什么原因?

代码如下:

    if ($forkpid = fork){
        父进程;
        ... ...
        发送邮件;
    }elsif (defined $forkpid){  ### child process. layout a simple message to user.

        $| = 1;
        my $ml = "进程结束将发邮件通知。";
        my $chld = new CGI;
        print $chld->header("text/html"),
                $chld->start_html("message"),
                $chld->h1("Thanks"),
                $chld->h3($ml),
                $chld->end_html();
                exit();
    }else {
        die "cannot fork: $!";
    }

论坛徽章:
0
2 [报告]
发表于 2007-12-18 00:23 |只看该作者
首先设计有问题,这种情况需要用fork吗?
其次把fork, perlipc, perlfork的文档再好好看看吧

[ 本帖最后由 Nosferatu 于 2007-12-18 00:26 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-12-18 15:14 |只看该作者
需要啊,不然用户关闭窗口的时候进程会结束的啊

论坛徽章:
0
4 [报告]
发表于 2007-12-18 16:36 |只看该作者
这种情况最好的解决办法是javascript

论坛徽章:
0
5 [报告]
发表于 2007-12-18 16:39 |只看该作者
呵呵,可是那个不会啊,没有别的办法吗?

论坛徽章:
0
6 [报告]
发表于 2007-12-18 16:57 |只看该作者
把STDOUT,STDIN,STDERR都关掉

论坛徽章:
0
7 [报告]
发表于 2007-12-18 20:06 |只看该作者
能否说的详细些?多谢啊!

论坛徽章:
0
8 [报告]
发表于 2007-12-18 22:50 |只看该作者
子进程里加入:

close STDOUT;
close STDIN;
close STDERR;

原因:
when you fork a new process, Perl has both processes (the parent and the child) hold on to the same STDOUT, STDIN, and STDERR. Therefore, when running as a CGI, the response will not return to the user until all of these are freed up.

论坛徽章:
0
9 [报告]
发表于 2007-12-19 16:37 |只看该作者
嗯,多谢!
不过我试了一下,似乎还是不行。
现在可以肯定的是fork是成功的,但是在需要等待较长时间时还是返回页面错误

唉,还有没有别的可能啊?

论坛徽章:
0
10 [报告]
发表于 2007-12-19 17:03 |只看该作者
父子进程里都关掉也不行吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP