簡體   English   中英

在ac程序中的linux中,“ lp filename”命令的調用是什么?

[英]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是最簡單的(也是將安全問題引入程序的最簡單的方法!),使用forkexecve是多種選擇之一(請man execve )。

是的,此代碼可以。 只要在/usr/bin找到lp並且filename文件存在,它將打印名為filename的文件。 如果希望程序在出現問題時報告錯誤,則可以添加檢查,否則程序將完全按預期運行。

正在做system("lp filename"); 如果您不介意在system()調用之后直到lp完成之前阻塞程序,它將可以工作。

您也可以使用popen(3) (而不是system(3) )。 但是,您始終需要派生一個進程( systempopen都在調用fork(2) )。 順便說一句,如果您有CUPS服務器,則可以使用一些HTTP客戶端協議庫,例如libcurl,但這可能很不方便。 更好地popensystem lp (或lpr )命令。

順便說一句,打印是一個相對較慢且復雜的操作,因此,分叉進程的開銷可以忽略不計(我相信您可以在服務器上完成;畢竟人們通常不會打印數百萬頁)。 一些庫可能會為您提供一些API(例如Qt中的QPrinter )。

注意, lp (或lpr )命令實際上並沒有進行打印,它只是與某些打印守護進程( cupsdlpd ...)及其后台打印系統進行交互。 參見例如CUPS 因此,運行lplpr命令的速度相當快(比打印本身快得多),通常要幾毫秒(肯定與多線程或服務器應用程序兼容)。

通常,構造傳遞給popensystem的命令(例如,使用snprintf(3)等),例如

  char cmdbuf[128];
  snprintf (cmdbuf, sizeof(cmdbuf), "lp %s", filename);

但要注意代碼注入 (考慮包含foo; rm -rf $HOME filename foo; rm -rf $HOME )和緩沖區溢出

當然,請注意,像systempopenfopen類的庫函數通常是在現有syscalls(2)之上構建的。 閱讀高級Linux編程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM