[英]In C, is there a way to pass a return value of one program to another program?
因為我是 C 新手,所以我有 2 個基本問題:
prog1 輸出:
/dev/hidraw0
/dev/hidraw1
/dev/hidraw2
prog1 代碼可以在這里找到:
https://pastebin.pl/view/379db296
prog2 代碼片段如下:
/* C */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
const char *bus_str(int bus);
int main(int argc, char **argv)
{
int fd;
int i, res, desc_size = 0;
char buf[256];
struct hidraw_report_descriptor rpt_desc;
struct hidraw_devinfo info;
char *device = "/dev/hidraw2"; /*** replace hardcoded value here dynamically ***/
if (argc > 1)
device = argv[1];
/* Open the Device with non-blocking reads. In real life,
don't use a hard coded path; use libudev instead. */
fd = open(device, O_RDWR);
prog1 編譯命令:
gcc -Wall -g -o prog1 prog1.c -ludev
prog2 編譯命令:
gcc prog2 prog2.c
一種方法,並且有很多,是使用 fork。 fork()
與其他 C 函數調用有點不同。 當你調用它時,你會得到一個正在運行的進程的額外副本。 然后,您可以比較返回值以確定哪個進程是父進程,哪個進程是子進程。
整個邏輯看起來有點像:
while (looping) {
char device[] = (set to the desired value);
int childPID = fork();
if (childPID == 0) {
/* this is the child */
doWhatever(device);
exit(0);
} else {
/* this is the parent */
/* let's wait on the child to complete */
wait();
}
現在這個例子非常簡單。 還有很多其他的考慮; 但是這種方法避免了在進程之間傳遞信息的其他更復雜的方法。 基本上,在調用fork()
時,子進程被創建為程序的副本,因此device
的內容將在兩個進程之間共享。
需要注意的一些問題是子進程需要向父進程報告他們的退出代碼。 因此,如果您不想一次運行一個進程,則需要一種更復雜的方法來wait()
子進程。
如果在本例中殺死父進程,子進程也將被殺死。 這可能是也可能不是你想要的。
其他方法(有些比其他方法好得多):
我相信還有很多其他方法; 但是,當您有兩個程序合作解決一個問題時,您會開始遇到很多問題,而這些問題通常在只考慮一個程序解決問題時不會遇到。
需要考慮的一些事項:
通信是可靠的——文件、套接字、網絡等有時都會失敗。 您需要驗證您的發送是否已發送,並提供一些方法來了解您的數據沒有因傳輸而損壞。
通信行為需要時間——您需要處理傳輸的打包、插入、檢索和拆包過程中的延遲; 並且,對於每條消息,這些延遲通常會發生巨大變化。
可以處理的消息數量是有限的——傳輸需要時間,時間意味着傳輸速率。 由於涉及到速率,您不能設計一個忽略通信路徑限制的工作程序。
消息可能被破壞或竊聽 - 雖然我們認為計算機永遠不會出錯,但當數據中的通信錯誤更頻繁地發生時。 這可能是由於很多原因(人們使用 telnet 測試套接字、對網絡的電氣干擾、管道文件被刪除等)此外,數據本身更容易被其他人讀取,這對某些程序來說是一個問題。
傳輸方式發生變化 - 即使您使用文件而不是網絡來傳輸信息,管理員也可以移動文件並插入符號鏈接。 網絡可以通過不同的路徑發送每一位信息。 不要假設靜態路徑。
您無法提供避免關鍵問題的說明 - 沒有計算機只有一個管理員,即使它是您自己的個人計算機。 自動化系統和子程序以及其他人確保您永遠無法向所有合適的人提供有關如何解決問題的說明。 編寫您的解決方案,避免需要由遵循自定義“必需”程序的人員實施的變通方法。
移動數據不是免費的——它需要時間、電力、RAM、CPU,可能還有磁盤或網絡。 即使解決方案的所有其他部分都是正確的,這些成本也會增加(如果不加以管理)以阻止您的程序運行。
數據的傳輸通常不是同質的 - 一旦您承諾采用一種信息交流方式,很可能不容易用另一種方式輕松替換它。 許多解決方案提供了其他方法中不存在的附加功能,即使您決定使用“僅網絡”傳輸,網絡之間的差異也可能使您的解決方案不像您想象的那樣通用。
有了這些認識,您就可以更輕松地創建一個有效的解決方案,並且在一些微小的細節發生變化時不會崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.