CGI怎样实现网页的跳转?

按照上面的思路试着实现了一下。两个文件,changeip.cgi放在apache里面,设置标记(/tmp/changeip)用;
changeip.pl从root下启动,是个daemon,每隔10秒检查标志文件有没有,有的话就改ip。

changeip.cgi

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl

use CGI qw/:standard/;

open FH, ">/tmp/changeip";
close FH;
print header();
print "Success! click <a href='http://192.168.1.15/'>here</a> for new address";
# 这里我直接加了个链接,用setTimeout也没问题

changeip.pl

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl

use POSIX 'setsid';

# create a daemon
exit if fork;
&setsid();
exit if fork;
chdir '/';
umask 022;
close STDIN;
close STDOUT;
close STDERR;

open STDIN, '/dev/null';
open STDOUT, '>/dev/null';
open STDERR, '>/dev/null';

$SIG{CHLD} = 'IGNORE';

while (1) {
    if (-f '/tmp/changeip') {
        changeip();
        unlink '/tmp/changeip';
        exit;
    }
    sleep(10);
}

sub changeip {
    $cfgfile = "/etc/sysconfig/network-scripts/ifcfg-eth0";
    $tmpfile = "/tmp/ifcfg-eth0.tmp.$$";
    open FH, $cfgfile;
    open FO, ">", $tmpfile;
    while (<FH>) {
        /^IPADDR/ and $_ = "IPADDR=192.168.1.15\n";
        print FO $_;
    }
    close FH;
    close FO;
    rename $tmpfile, $cfgfile;

    system '/etc/init.d/network restart';
}

如果可行的话,创建daemon的代码可以参考这篇文章:
http://tech.idv2.com/2006/10/12/create-daemon-with-perl/
这个思路到不错,明天去公司测试下
测试了,这种方案可以;还有的问题就是,1、怎么让浏览器刷新啊,也就是回复的时候该怎么写(我让页面自动刷新就是不成功)。2、由于我的窗口是在框架内,怎么让回复的网页,在原来的页面_top方式显示

在回答的网页上这样写就可以20秒之后转到 http://newip/xxx.html上
<script>window.setTimeout("location.href = 'http://newip/xxx.html'", 20000);</script>
可以了,谢谢!
另外的小问题,由于我的IP修改页面是在frameset框架内的,回复的时候怎么显示在整个窗口内,替换原来的窗口?
我的回复代码如下,还需要加入什么命令内

[Copy to clipboard] [ - ]
CODE:
//print content-type header
void print_mime_header(void)
{
      printf("Content-Type: text/html\n\n");
}

//print HTML page header
void print_html_header(void)
{
        printf(
                "<html>\n"
                "<head><title>Response</title></head>\n"
                "<body "
                "bgcolor = #FEFEFE "
                "text=#000000 "
                "link=#000040 "
                "alink=#ff0040 "
                "vlink=#7f7f7f "
                "background=/images/kbd_bg.jpg"
                ">\n"
                );
}

void print_buffer(char *buf)
{
        printf("%s", buf);
}

//prints closing HTML info
void print_html_trailer(void)
{
        printf(
                "</body>\n"
                "</html>\n"
                );
}

sprintf(buf, "<script>window.setTimeout(\"location.href = 'http://%s/'\", 2000);</script>\n", ip);
print_mime_header();                       
print_buffer(buf);
print_html_header();
sprintf(buf, "<h3>Modify success. The web is updating...</h3>\n");
print_buffer(buf);
print_html_trailer();
fflush(stdout);                                       
exit(0);

总结下我的步骤,以提供给以后遇到此类问题的朋友:
我的平台是嵌入式Linux+arm9(2410)+BOA web server
1、通过表单提交设置信息给服务器;
2、服务器调用表单指定的cgi程序进行处理;
3、该CGI程序的处理如下:
    a、首先检查输入信息的合法性;
    b、若合法则保存到系统中一个配置文件中(自行指定),并回复信息给浏览器(告诉浏览器隔2秒刷新页面),退出cgi;否则,提示出错, 退出cgi;
4、后台一直运行的守护进程一直在做的工作就是,每隔1s检查一次配置文件是否修改,检查的方法如下;
    a、守护进程一运行就调用stat函数获取配置文件的最后修改时间;
    b、循环中每隔1s调用stat函数获取配置文件的最新修改时间;
    c、用新获取的时间与老的时间比较,若不等,则进行IP地址设定;
    d、IP地址设定成功后,用新的时间变量替换老的时间变量
这样写:

top.location.href = '.....'

就会冲掉原来的框架了


QUOTE:
原帖由 xzsxiao213 于 2008-11-5 14:25 发表
总结下我的步骤,以提供给以后遇到此类问题的朋友:
我的平台是嵌入式Linux+arm9(2410)+BOA web server
1、通过表单提交设置信息给服务器;
2、服务器调用表单指定的cgi程序进行处理;
3、该CGI程序的处理如 ...

多谢总结。
补充两点:
1. daemon检查的时间间隔最好不要太短,当心由于网络延迟等原因,导致结果还没发到浏览器,ip就变了。局域网应该问题不大。
2. daemon占用的内存要尽可能少,不必要的话尽量少use东西。
终于完成了,多谢odacharlee的耐心指导