Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从命令行执行时,CGI C输出正确,但从web请求执行时不正确_C_Linux_Apache2_Cgi - Fatal编程技术网

从命令行执行时,CGI C输出正确,但从web请求执行时不正确

从命令行执行时,CGI C输出正确,但从web请求执行时不正确,c,linux,apache2,cgi,C,Linux,Apache2,Cgi,代码: #包括 #包括 类型定义结构hddinfo { char-szDevice[4]; char-szMfg[64]; char-szModel[64]; int nTemp; }hddinfo; int main(int argc,char*argv[]) { setuid(0); hddinfohdi[4]={0}; 文件*fp=popen(“/usr/sbin/hddtemp/dev/sd[abcd]”,即“r”); 如果(NULL!=fp) { 对于(int i=0;i

代码:

#包括
#包括
类型定义结构hddinfo
{
char-szDevice[4];
char-szMfg[64];
char-szModel[64];
int nTemp;
}hddinfo;
int main(int argc,char*argv[])
{
setuid(0);
hddinfohdi[4]={0};
文件*fp=popen(“/usr/sbin/hddtemp/dev/sd[abcd]”,即“r”);
如果(NULL!=fp)
{
对于(int i=0;i<4;i++)
fscanf(fp,/dev/%3[^:::::%64s%64[^:::%d°C\n“,&hdi[i].szDevice,&hdi[i].szMfg,&hdi[i].szModel,&hdi[i].nTemp);
pclose(fp);
printf(“内容类型:text/html\n\n”);
printf(“\n\t\n\t\t设备\n\t\tMfg\n\t\tModel\n\t\tTemp\n\t\n”);
对于(int i=0;i<4;i++)
printf(“\t\n\t\t%s\n\t\t%s\n\t\t%s\n\t\t%d°;C\n\t\n”,hdi[i]。szDevice,hdi[i]。szMfg,hdi[i]。szModel,hdi[i]。nTemp);
printf(“”);
}
其他的
printf(“状态:400错误请求\n内容类型:text/html\n\n”);
返回0;
}
从命令行作为
www-data
用户运行时输出:


装置
制造
模型
临时雇员
sda
WDC
WD2500AAKX-001CA0
29度;C
sdb
WDC
WD20EURS-63S48Y0
30度;C
sdc
WDC
WD20EURS-63S48Y0
30度;C
sdd
WDC
WD20EURS-63S48Y0
30度;C
通过web浏览器访问时的输出:


装置
制造
模型
临时雇员
sda
WDC
WD2500AAKX-001CA0
29度;C
0°;C
0°;C
0°;C

好的,我发现了问题。。。显然,每当apache为web请求运行程序时,都不包含度字符,而是包含空格字符。我还可以通过管道将输出传输到另一个应用程序,从命令行复制该问题,如下所示:

./hddtemp.cgi | tee

删除degree字符可以修复web请求的输出,但是在命令行调用中会出现问题。看起来我被一个或另一个工作困住了

您的
fscanf
调用中似乎有非ASCII格式(用于学位符号)


这很可能就是解析停止的地方,因为在CGI中执行时,
LANG=C
,而在命令行上执行时,它被设置为其他内容。

对于我来说,更好的选项似乎是在
hddtemp
上指定
--numeric
标志,但这确实意味着我失去了获得制造商和sku/型号的机会。感谢您在解决自己问题时的奉献精神,同时也为他人发表您的想法。啊!!!!现在我明白了为什么它在从命令行运行时放置学位标志,而不是在通过管道传输或从web服务调用时。似乎
hddtemp
正在检查
LANG
环境变量,并确定是否放置学位符号。因此,如果我将我的命令调用更改为
LANG=C/user/sbin/hddtemp/dev/sd[abcd]“
,并删除了学位符号,那么这两种方法都可以使用!