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

来源:互联网 发布:大数据考试题目及答案 编辑:程序博客网 时间:2024/05/29 17:50

我的逻辑是,在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 0int 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到通道代码,下篇会讲读取和显示方法.


0 0
原创粉丝点击