CGI不在MAMP下打印

时间:2016-03-06 03:12:00

标签: c macos printing cgi mamp

我正在使用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正确执行),但没有输出到打印机。 为什么?有什么想法吗?

1 个答案:

答案 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;
 }

希望这会有所帮助。