2017-02-19 138 views
0

我有一個調用另外一個C程序,就像如何捕獲輸出?

system("path/program2 path/file.txt"); 

使程序可以處理指令文件。該程序提供了我想在我的C程序中使用的信息,但我沒有「program2」的源,因此我無法編輯它。

目前我正在編寫一個文件(我可以選擇在控制檯上顯示信息或寫入文件之間進行選擇),然後在我的C程序中打開文件然後閱讀,但我想也許這是可能的使它更好,但我真的生鏽的C ...

任何人都可以提供一些想法和/或建議嗎?

謝謝!


編輯

你們有些人建議,我看着fork()exec()dup2()功能,我想我有一個更好的方法現在信息共享。

所以,到現在爲止我有這樣的:

  • 程序1,使system()調用運行program2
  • 程序2創建一個臨時文件temp.txt和寫入信息
  • 回到程序1,它會打開temp.txt,讀,操縱信息。

這使得2個開放式的和2個接近的現在

,與theese功能,我可以做

  • 程序1,使開放的處理程序,以temp.txt
  • 程序1,使fork()自身複製
  • on program1.child,調用dup2()函數將標準輸入重定向到temp.txt
  • 在program1.child一個 exec()功能
  • 被調用運行program2
  • 程序2,使工作和顯示的所有信息(將被重定向到temp.txt
  • 而這一切,program1.father將wait()直到program1.child結束
  • 上月底,program.father將讀取文件內容,並使用數據

我覺得這個過程可能是有效的,但我仍然有一個缺陷 - 使用文件。

我想要這個程序在服務器上運行,所以我認爲使用文件可能會令人困惑,甚至是危險的...但仍然這種方法比我使用的方式更好,直到我找到更好的東西我敢打賭我可以設法管理服務器端的文件創建...

所以,是「新」的程序是否有效?


最後編輯:

所以,用popen()所有的問題就解決了。

FILE *in; 
extern FILE *popen(); 
char buff[512]; 

if(!(in = popen("path/program2 path/file.txt", "r"))){ 
    //error; 
} 

while(fgets(buff, sizeof(buff), in) != NULL){ 
    printf("%s", buff); 
} 

pclose(in); 

(從sw-at.com提取)

謝謝大家的幫助!今天我學到了一些東西!

+1

請勿使用'system'。創建一個新的進程來執行'program2',並設置它的'stdout'來管道你的'program1'。 – StoryTeller

+0

我只是谷歌它...你的意思是fork()函數? –

+0

如果你在POSIX系統上,那麼是的。如果沒有,請參閱您的操作系統的開發者文檔。 – StoryTeller

回答

0

有兩種方法可以讓我想到在不使用臨時文件的情況下實現您的願望。

  1. 使用UNIX殼牌

如果您在* nix,那麼你可以簡單地執行這兩個方案爲:

$ ./prog2 | ./prog1 

prog2寫入stdoutprog1stdin讀取。 |字符創建一個管道,prog1prog2之間的單向信道直接聯邦調查局的prog2prog1輸出,而不使用臨時文件。

  • 在不使用外殼

    2.1)prog2創建pipe

    int pipefd[2]; 
    pipe(pipefd); 
    

    2.2)然後forkprog2

    fork() 
    

    2.3 )接下來,在孩子execprog1pipefd[0]作爲參數

    char buffer[10]; 
    snprintf(buffer, 10, "%s", pipefd[0]); 
    int execl("./prog1", "./prog1", buffer, (char *)0); 
    

    2.4)現在prog2pipefd[1]prog1pipefd[0]

  • 閱讀在prog1你需要使用atoi()檢索pipefd[0]

    foo = atoi(argv[1]); 
    

    現在從閱讀。

    +0

    嗨。請記住,我無法修改「program2」,因爲我沒有源代碼。 –

    +0

    @DavidSoléGonzález那麼爲什麼不使用shell'pipe'運算符呢?我猜如果你沒有訪問源**和**你不想使用臨時文件,那麼這是唯一的方法。 – rootkea

    +0

    我不能在這裏使用管道,我沒有直接通過shell啓動program1,它是我正在工作的Apache插件處理程序。謝謝你的時間 :) –