簡體   English   中英

在 C 中,有沒有辦法將一個程序的返回值傳遞給另一個程序?

[英]In C, is there a way to pass a return value of one program to another program?

因為我是 C 新手,所以我有 2 個基本問題:

  1. 如何將 C 程序的返回值傳遞給另一個程序? prog1 將列出項目(項目數量可以在每次執行時改變),我只想存儲最后一個項目值並將其傳遞給另一個 prog2 以用於不同的目的。 基本上prog1的輸出在下面,我想提取列表中的最后一項,即prog2的/dev/hidraw2。 Prog2 目前正在使用硬編碼值,我想讓它更加動態。

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);
  1. 如果上面的問題 1 解決了,即使它們具有不同的編譯參數,我是否可以直接將 prog1 合並到 prog2 中? 你預見到那里有什么問題嗎?

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()子進程。

如果在本例中殺死父進程,子進程也將被殺死。 這可能是也可能不是你想要的。

其他方法(有些比其他方法好得多):

  1. 使用 IPC 創建基於共享內存和信號量的生產者/消費者模式(以控制誰寫入共享內存,因此讀取過程不會讀取部分寫入的條目或刪除部分創建問題的項目。
  2. 使用上述方法(fork),但在子進程讀取的模式中創建一個未命名的管道。 這可以允許孩子處理多個請求。
  3. 使用獨立於兩個程序存在的命名管道(一種非常特殊的文件)。 這允許獨立啟動孩子。
  4. 使用由生產者編寫並由消費者讀取的常規文件。 這將需要某種信號,指示文件何時可以安全寫入(因此消費者不會讀取錯誤)以及文件何時可以安全讀取/縮短(因此寫入者不會損壞文件)。

我相信還有很多其他方法; 但是,當您有兩個程序合作解決一個問題時,您會開始遇到很多問題,而這些問題通常在只考慮一個程序解決問題時不會遇到。

需要考慮的一些事項:

  1. 通信是可靠的——文件、套接字、網絡等有時都會失敗。 您需要驗證您的發送是否已發送,並提供一些方法來了解您的數據沒有因傳輸而損壞。

  2. 通信行為需要時間——您需要處理傳輸的打包、插入、檢索和拆包過程中的延遲; 並且,對於每條消息,這些延遲通常會發生巨大變化。

  3. 可以處理的消息數量是有限的——傳輸需要時間,時間意味着傳輸速率。 由於涉及到速率,您不能設計一個忽略通信路徑限制的工作程序。

  4. 消息可能被破壞或竊聽 - 雖然我們認為計算機永遠不會出錯,但當數據中的通信錯誤更頻繁地發生時。 這可能是由於很多原因(人們使用 telnet 測試套接字、對網絡的電氣干擾、管道文件被刪除等)此外,數據本身更容易被其他人讀取,這對某些程序來說是一個問題。

  5. 傳輸方式發生變化 - 即使您使用文件而不是網絡來傳輸信息,管理員也可以移動文件並插入符號鏈接。 網絡可以通過不同的路徑發送每一位信息。 不要假設靜態路徑。

  6. 您無法提供避免關鍵問題的說明 - 沒有計算機只有一個管理員,即使它是您自己的個人計算機。 自動化系統和子程序以及其他人確保您永遠無法向所有合適的人提供有關如何解決問題的說明。 編寫您的解決方案,避免需要由遵循自定義“必需”程序的人員實施的變通方法。

  7. 移動數據不是免費的——它需要時間、電力、RAM、CPU,可能還有磁盤或網絡。 即使解決方案的所有其他部分都是正確的,這些成本也會增加(如果不加以管理)以阻止您的程序運行。

  8. 數據的傳輸通常不是同質的 - 一旦您承諾采用一種信息交流方式,很可能不容易用另一種方式輕松替換它。 許多解決方案提供了其他方法中不存在的附加功能,即使您決定使用“僅網絡”傳輸,網絡之間的差異也可能使您的解決方案不像您想象的那樣通用。

有了這些認識,您就可以更輕松地創建一個有效的解決方案,並且在一些微小的細節發生變化時不會崩潰。

暫無
暫無

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

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