CGI程序学习(2)-CGI执行Shell脚本后无法在浏览器正常显示问题

我的逻辑是,在CGI中执行一个Shell脚本,在浏览器上显示脚本生成的文本中的WIFI数据.但是浏览器一直无法正常显示,纠结了好几天.

Shell脚本大概这样:

#! /bin/sh
  echo "12345" > wifi_info

如果不执行脚本中 > wifi_info ,浏览器上正常显示

后来重新学习CGI基础原理,终于知道原因在哪里. 用户浏览器上显示的数据是 执行./cgi程序打印在通道上的数据,而Shell脚本执行 >wifi_info后,通道重定向到文本中,所以后面打印的数据无法正确打印在当前用户浏览器的通道上面,需要重定向回原来的通道上.


dup dup2函数学习

dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。 

函数原形如下:

#include <unistd.h>
    int dup( int oldfd );
    int dup2( int oldfd, int targetfd )


利用这个函数,我可以用dup对原通道进行复制,然后执行Shell脚本写入文本后,使用dup2将通道重定向为原通道,再在该通道打印需要显示的内容,就可以正常显示了

基于以上原理,最终代码如下:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#define STDIN_FILENO 0

int main()
{
    /*--------------------重定向设定----------------*/
    int fd = dup(STDOUT_FILENO);//复制原通道
    /*--------------------执行shell-----------------*/
    pid_t status;

    status = system("wifi.sh");//执行shell命令,会定向写入文件
	
    if(-1 == status)//判断shell是否执行成功
    {
        printf("System error!");
	return -1;
    }
	
    dup2(fd, STDOUT_FILENO);//重定向为浏览器通道	
    show();//读取文本并显示
    close(fd);//关闭标识                     
                       
    return 0;
}

show()函数里面涉及读取文本和printf到通道代码,下篇会讲读取和显示方法.


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值