我的逻辑是,在CGI中执行一个Shell脚本,在浏览器上显示脚本生成的文本中的WIFI数据.但是浏览器一直无法正常显示,纠结了好几天.
Shell脚本大概这样:
#! /bin/sh
echo "12345" > wifi_info
如果不执行脚本中 > wifi_info ,浏览器上正常显示
后来重新学习CGI基础原理,终于知道原因在哪里. 用户浏览器上显示的数据是 执行./cgi程序打印在通道上的数据,而Shell脚本执行 >wifi_info后,通道重定向到文本中,所以后面打印的数据无法正确打印在当前用户浏览器的通道上面,需要重定向回原来的通道上.
dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。
函数原形如下:
#include <unistd.h>
int dup( int oldfd );
int dup2( int oldfd, int targetfd )
基于以上原理,最终代码如下:
#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到通道代码,下篇会讲读取和显示方法.