[英]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.