有一个用户留言簿CGI程序困扰了我两个礼拜了 前置html网页POST进去但是linux下总是跑不通,大致程序如下:其中我有一大部分都注释掉了没必要看,主要替我看下主程序和主要的取数据程序,放到乌帮图虚拟机下程序虽然能GCC编译成功,但有个warning:passing argument 1 of 'fopen' from incompatible pointer type /usr/include/stdio.h:249:note:expected'const char *_restrict_'but argument is of type'struct FILE',可能对解决问题有用也可能无所谓,但我主要的问题就是我前置网页点击按键调用这个cgi程序时出现502BAD GATEWAY,这个问题很常见,一般来说就是程序的问题,我用gdb单步调试这个程序,gdb上显示Program received signal SIGSEGV,Segmentation fault.0x001a0de0 in strcpy() from /lib/tls/i686/cmov/libc.s0.6,这个问题不管我如何修改程序都有,除非我把get_inputs和voidprint_file都注释掉,请问这个问题该如何解决?这个错误究竟什么意思?这问题真的让我很头疼,我一度还怀疑环境变量不存在所以才读不进去,我env了下linux没发现REQUEST_STRING那些环境变量但是环境变量在这里应该是自动生成的呀,每天都在想这问题真的很头痛,求哪位大哥能帮我解决下,程序比较长对不住了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//void translate(char *sourcestr);
int get_inputs();
void html_header(char *headtitle, char *bodytitle);
void html_foot();
void print_file(char *name , char *email , char *comments);
//void display_counter();
void print_form();
/*预定义的一些常量*/
#define advicefile "http://192.168.12.134/cgi-bin/UserAdvice.txt"
#define counter "http://192.168.12.134/cgi-bin/counter.dat"
#define keyfile1 "http://192.168.12.134/cgi-bin/keyfile1.dat"
#define keyfile2 "http://192.168.12.134/cgi-bin/keyfile2.dat"
/*变量说明*/
typedef struct {
char *name;
char *value;
} htmlinput_struct;
htmlinput_struct htmlinputs[100];
int htmlinputcount = 0;
char *yourname;
char *youremail;
char *yourcomments;
/*主程序*/
int main ()
{
int i;
/*下面根据环境变量REQUEST_METHOD的值从标准输入中或者从环境变量QUERY_STRING中
读取从客户机发送来的表单输入数据。如果无用户输入数据,则显示一个HTML表单并结束程序。*/
if(!get_inputs())
{
print_form();
return 1 ;
}
/*下面从htmlinputs中读取HTML表单变量:yourname,
youremail,yourcomments*/
for (i=0;i<htmlinputcount;i++)
{
if (! strcmp(htmlinputs[i].name,"yourname"))
strcpy(yourname,htmlinputs[i].value);
if (! strcmp(htmlinputs[i].name,"youremail"))
strcpy(youremail,htmlinputs[i].value);
if (! strcmp(htmlinputs[i].name,"yourcomments"))
strcpy(yourcomments, htmlinputs[i].value);
}
/*检查yourname的值和yourcomments的值是否为空,
如果是的话,则输出"输入错误"的响应结果以后结束程序*/
if (! strcmp(yourname,"") || ! strcmp(yourcomments,""))
{
html_header("用户意见簿---相应","输入错误");
printf("<H2>必须输入你的名字并发表意见!</H2> \n");
html_foot();
return(1);
}
/*下面将用户信息存入用户意见文件UserAdvice.txt,
并输出“输入正确”的响应结果*/
print_file(yourname,youremail,yourcomments);
html_header("用户意见簿---响应","输入正确");
printf("<H2>非常感谢你的宝贵意见! </H2> \n");
//display_counter();
html_foot();
return(0);
}
/*子程序translate,功能:将字符串sourcestr中用%后跟两
个十六进制数表示的字符转换成正常字符*/
/*void translate(char *sourcestr)
{
int i = 0;
int j = 0;
char *tempstr;
char tempchar1 , tempchar2;
tempstr = malloc(sizeof(char) * strlen(sourcestr)+1);
while (sourcestr[j])
{
if ((tempstr[i] = sourcestr[j]) == '%')
{
if (sourcestr[j+1] >= 'A')
tempchar1 = ((sourcestr[j+1] & 0xdf) - 'A')+10;
else
tempchar1 = (sourcestr[j+1] - '0');