thttpd中cgi使用的注意事项

1、cgi运行环境

在thttpd代码中,cgi是通过execve函数调用的

int execve(const char *filename, char *const argv[], char *const envp[]); 

**execve()**执行程序由 filename决定。
filename必须是一个二进制的可执行文件,或者是一个脚本以#!格式开头的解释器参数参数。如果是后者,这个解释器必须是一个可执行的有效的路径名,但是不是脚本本身,它将调用解释器作为文件名。
argv是要调用的程序执行的参数序列,也就是我们要调用的程序需要传入的参数。
envp 同样也是参数序列,一般来说他是一种键值对的形式 key=value. 作为我们是新程序的环境。
所以,在调用cgi时如果运行了动态库,需要将动态库的环境包含在envp中,thttpd代码添加如下

//CGI_LD_LIBRARY_PATH即是运行的动态库环境,如果不定义该宏则是默认的动态路径
//(/opt/app/lib3rd:/opt/app/libsdk是我添加的动态库路径,并需要把#ifdef notdef屏蔽)
#ifdef notdef
#define CGI_LD_LIBRARY_PATH "/usr/local/lib:/usr/lib:/opt/app/lib3rd:/opt/app/libsdk"  
#endif

2、cgi全局变量

如果cgi调用的函数中,包含了其他函数中的全局变量,那这个全局变量不生效,因为execve已经是一个独立的进程,和原本的进程没有关系了,所以全局变量也不会共用,即在a进程中全局变量的值,和execve进程中全局变量的值不相等

3、cgi设置http响应头信息(如cookie)

设置Cookie时,需在 printf(“Content-type:text/html\n\n”); 前设置,否则会当成response body

4、cgic获取post数据

简单的cgi获取post数据可以通过stdin来获取,参考
https://blog.csdn.net/shallnet/article/details/50896985
然而,cgic库中,stdin的数据已经被处理过了,因此程序内再次读取sdin时并不能读到数据
可以用cgic中的 cgiFormEntries 或者 cgiFormString
当知道表单的名称时,可以使用cgiFormString,不知道时可以使用cgiFormEntries

//cgiFormString获取数据
int cgiMain() {
   
	char name[241];
	char number[241];
	cgiHeaderContentType("text/html");
	fprintf(cgiOut, "<HTML><HEAD>\n");
	fprintf(cgiOut, "<TITLE>My CGI</TITLE></HEAD>\n");
	fprintf(cgiOut, "<BODY>");
	cgiFormString("name", name, 241);
	cgiFormString("number", number, 241);
	fprintf(cgiOut, "<H1>%s</H1>",name);
	fprintf(cgiOut, "<H1>%s</H1>",number);
	fprintf(cgiOut, "</BODY>\n");
	fprintf(cgiOut, "</HTML>\n");
	return 0;
}
//cgiFormEntries 获取数据
char **form;
cgiFormEntries(&form);

5、thttpd中cgi代码解析

cgi_child( httpd_conn* hc )
    {
   
    int r;
    char** argp;
    char*
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值