自己编写的Linux Web Server调用CGI程序时出现问题 50
从http请求包头中获得CGI的程序名,还有参数,然后启动子进程去执行CGI程序,子进程讲输出写到管道中,然后退出,父进程将数据从管道中读出,最后回复用户请求。但是没每次...
从http请求包头中获得CGI的程序名,还有参数,然后启动子进程去执行CGI程序,子进程讲输出写到管道中,然后退出,父进程将数据从管道中读出,最后回复用户请求。但是没每次启动程序,CGI就只能启动一次。第二次用户请求CGI程序时,就不行了。if (pid==0){dup2(pe[1],STDOUT_FILENO);// 关闭close(pe[0]);// 已重定向,向STDOUT发送消息,即通过管道向父进程发送消息// printf("star new process %d ",getpid());// for (int i=0;cgi_argv[i]!=NULL;i++)// {// printf("%s ",cgi_argv[i]);// }// exit(0);execvp(full_cgi_name,cgi_argv);}else{close(pe[1]);signal(SIGCHLD, &sig_chld);int icontentlen=read(pe[0],contentbuf,1024);CGI程序只能启动一次,用for循环(粗体部分)打印出来的字符串参数是正确。但是execvp只有第一次成功。下面是我CGI程序的代码。#include#includevoid main(int arg, char* argv[]){printf("%s,hello ",argv[1]);printf("%s ",argv[2]);printf("cgi test sucess!!!");exit(0);}毕业设计来的,各位大哥大姐帮帮忙
从http请求包头中获得CGI的程序名,还有参数,然后启动子进程去执行CGI程序,子进程讲输出写到管道中,然后退出,父进程将数据从管道中读出,最后回复用户请求。但是没每次启动程序,CGI就只能启动一次。第二次用户请求CGI程序时,就不行了。CGI程序只能启动一次,用for循环(粗体部分)打印出来的字符串参数是正确。但是execvp只有第一次成功毕业设计来的,各位大哥大姐帮帮忙
多进程代码:
CGI程序代码: 展开
从http请求包头中获得CGI的程序名,还有参数,然后启动子进程去执行CGI程序,子进程讲输出写到管道中,然后退出,父进程将数据从管道中读出,最后回复用户请求。但是没每次启动程序,CGI就只能启动一次。第二次用户请求CGI程序时,就不行了。CGI程序只能启动一次,用for循环(粗体部分)打印出来的字符串参数是正确。但是execvp只有第一次成功毕业设计来的,各位大哥大姐帮帮忙
多进程代码:
CGI程序代码: 展开
展开全部
如果你的程序中的 CGI 程序只能启动一次,可能是因为你的程序没有正确处理子进程退出的情况。
在调用 execvp 函数启动子进程执行 CGI 程序时,子进程会替换掉父进程的代码和数据空间,执行 CGI 程序。如果 CGI 程序执行完毕后正常退出,子进程会自动结束,父进程会收到子进程退出的信号。
在收到子进程退出的信号后,父进程应该调用 wait 或者 waitpid 函数等待子进程退出,并获取子进程的退出状态。如果父进程没有调用 wait 或者 waitpid 等待子进程退出,子进程可能会变成僵尸进程,导致后续的 CGI 程序无法正常启动。
因此,建议在父进程中调用 wait 或者 waitpid 等函数等待子进程退出,以避免出现僵尸进程的情况。
回答不易,请点个赞。
在调用 execvp 函数启动子进程执行 CGI 程序时,子进程会替换掉父进程的代码和数据空间,执行 CGI 程序。如果 CGI 程序执行完毕后正常退出,子进程会自动结束,父进程会收到子进程退出的信号。
在收到子进程退出的信号后,父进程应该调用 wait 或者 waitpid 函数等待子进程退出,并获取子进程的退出状态。如果父进程没有调用 wait 或者 waitpid 等待子进程退出,子进程可能会变成僵尸进程,导致后续的 CGI 程序无法正常启动。
因此,建议在父进程中调用 wait 或者 waitpid 等函数等待子进程退出,以避免出现僵尸进程的情况。
回答不易,请点个赞。
展开全部
if (pid==0){
dup2(pe[1],STDOUT_FILENO);
// 关闭
close(pe[0]);
// 已重定向,向STDOUT发送消息,即通过管道向父进程发送消息
// printf("star new process %d ",getpid());
// for (int i=0;cgi_argv[i]!=NULL;i++)
// {
// printf("%s ",cgi_argv[i]);
// }
// exit(0);
execvp(full_cgi_name,cgi_argv);
}
else{
close(pe[1]);
signal(SIGCHLD, &sig_chld);
int icontentlen=read(pe[0],contentbuf,1024);
CGI程序只能启动一次,用for循环(粗体部分)打印出来的字符串参数是正确。
但是execvp只有第一次成功。下面是我CGI程序的代码。
#include <stdio.h>
#include <stdlib.h>
void main(int arg, char* argv[])
{
printf("%s,hello ",argv[1]);
printf("%s ",argv[2]);
printf("cgi test sucess!!!");
exit(0);
}
dup2(pe[1],STDOUT_FILENO);
// 关闭
close(pe[0]);
// 已重定向,向STDOUT发送消息,即通过管道向父进程发送消息
// printf("star new process %d ",getpid());
// for (int i=0;cgi_argv[i]!=NULL;i++)
// {
// printf("%s ",cgi_argv[i]);
// }
// exit(0);
execvp(full_cgi_name,cgi_argv);
}
else{
close(pe[1]);
signal(SIGCHLD, &sig_chld);
int icontentlen=read(pe[0],contentbuf,1024);
CGI程序只能启动一次,用for循环(粗体部分)打印出来的字符串参数是正确。
但是execvp只有第一次成功。下面是我CGI程序的代码。
#include <stdio.h>
#include <stdlib.h>
void main(int arg, char* argv[])
{
printf("%s,hello ",argv[1]);
printf("%s ",argv[2]);
printf("cgi test sucess!!!");
exit(0);
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询