我正在使用MAMP(所以在Mac上)并在C中使用CGI。我已经制作了以下代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Content-Type: text/html; charset=utf-8\n\n");
printf("Hello <b> in bold</b>\n");
FILE *f = popen("lp -", "w");
if (!f)
{
printf("<b>ERROR</b>\n");
exit(1);
}
fprintf(f, "This will be send to printer");
return 0;
}
当我在终端下运行它(当然在编译之后)时,我看到文本“Hello in bold”和“This will be sent to printer”的输出正确发送到打印机。 但是当我将CGI放在MAMP中的cgi-bin文件夹中并调用CGI时,文本正确显示(意味着CGI正确执行),但没有输出到打印机。 为什么?有什么想法吗?
答案 0 :(得分:0)
有效! 首先非常感谢那些投入了大量帮助的人。 我将解释我所做的事情,因为它可以在这个CGI问题之外有用。 从Mac的桌面运行CGI(问题中的代码)是可以的。作为CGI运行不提供打印机输出,但文本&#34;你好以粗体显示&#34;已正确显示在网页上。 看看Apache Erro日志(关于Applications / MAMP / logs / apache_error.log),感谢Antti Haapala,我看到了:
lp\xc2\xa0: erreur - aucune destination par d\xc3\xa9faut disponible.
含义&#34;没有默认目标可用&#34;。在执行&#34;其中lp&#34; (感谢我&#39; L&#39;我)我得到/ usr / bin / lp,在我的popen()调用中设置它并运行CGI。 我进入了错误日志:
/usr/bin/lp\xc2\xa0: erreur - aucune destination par d\xc3\xa9faut disponible.
同样的答案......搜索后我发现一个奇怪的观点:当我从桌面运行CGI(点击它)时,使用我在“首选项”面板中设置的默认打印机(EPSON M105)进行打印我的Mac。这意味着当您从桌面使用popen(lp)时,它可以正常工作。但是当您通过Apache在CGI中使用它时,对于CGI,没有默认打印机,这意味着Mac OSX似乎有两个默认的打印机设置。 所以,在终端下,我已经完成了:
lpstat -a
获取可用的打印机列表。然后,就这样做:
lpoptions -d PRINTERNAME
替换&#34; PRINTERNAME&#34;通过您从prievious comande获得的打印机名称,为&#34; lp&#34;设置默认打印机。
然后再次运行CGI。现在,它打印但....给出内部服务器错误!!
再次搜索后,我发现使用lp&#34; w&#34;输出打印机的名称。扼杀,似乎在执行pclose()时完成了输出,好像你没有把pclose()放在你没有错误500的情况下。 要使用pclose()并避免此输出,您必须使用&#34; r +&#34;在popen()而不是&#34; w&#34;。
好的代码是:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int status;
printf("Content-Type: text/html; charset=utf-8\n\n");
printf("Hello test 7 <b> in bold</b>\n");
FILE *f = popen("lp -", "r+");
if (!f)
{
printf("<b>ERROR</b>\n");
exit(1);
}
fprintf(f, "Text that will be send to the printer");
fflush(f);
status = pclose(f);
printf("Hello <b> in bold 2</b>\n");
return 0;
}
希望这会有所帮助。