[英]What is the call for the “lp filename” command in linux in a c program?
我想在Linux的ac程序中使用以上命令。
到目前为止,我已经搜索了可能在代码中进行的系统调用和exec调用。 还有其他使用exec或系统命令的方式吗? 对于多线程服务器,使用system命令不是理想的命令,您有何建议?
首先确保在此路径中安装了lp
。 (在终端中使用which lp
)。
您可能想了解lp
命令。 这是将数据发送到“行式打印机”的经典unix命令,但是现在它也可以与.pdf
文件一起使用,具体取决于您的打印机系统。 但是,不一定要安装它。 有时, lpr
也可能会更好。
另请参阅: http : //en.wikipedia.org/wiki/Lp_%28Unix%29
第二部分是关于执行unix命令的。 system
是最简单的(也是将安全问题引入程序的最简单的方法!),使用fork
和execve
是多种选择之一(请man execve
)。
是的,此代码可以。 只要在/usr/bin
找到lp
并且filename
文件存在,它将打印名为filename
的文件。 如果希望程序在出现问题时报告错误,则可以添加检查,否则程序将完全按预期运行。
正在做system("lp filename");
如果您不介意在system()
调用之后直到lp
完成之前阻塞程序,它将可以工作。
您也可以使用popen(3) (而不是system(3) )。 但是,您始终需要派生一个进程( system
和popen
都在调用fork(2) )。 顺便说一句,如果您有CUPS服务器,则可以使用一些HTTP客户端协议库,例如libcurl,但这可能很不方便。 更好地popen
或system
lp
(或lpr
)命令。
顺便说一句,打印是一个相对较慢且复杂的操作,因此,分叉进程的开销可以忽略不计(我相信您可以在服务器上完成;毕竟人们通常不会打印数百万页)。 一些库可能会为您提供一些API(例如Qt中的QPrinter )。
注意, lp
(或lpr
)命令实际上并没有进行打印,它只是与某些打印守护进程( cupsd
, lpd
...)及其后台打印系统进行交互。 参见例如CUPS 。 因此,运行lp
或lpr
命令的速度相当快(比打印本身快得多),通常要几毫秒(肯定与多线程或服务器应用程序兼容)。
通常,构造传递给popen
或system
的命令(例如,使用snprintf(3)等),例如
char cmdbuf[128];
snprintf (cmdbuf, sizeof(cmdbuf), "lp %s", filename);
但要注意代码注入 (考虑包含foo; rm -rf $HOME
filename
foo; rm -rf $HOME
)和缓冲区溢出
当然,请注意,像system
, popen
, fopen
类的库函数通常是在现有syscalls(2)之上构建的。 阅读高级Linux编程
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.