2015-03-31 60 views
1

例如,假設我有一個文件server.c,它不打印任何東西,但是有一個字符串,例如:「魚在空中游泳」。我想要做的是讓child.c打印server.c的字符串 甚至可能嗎?我被告知使用管道(如popen())會有所幫助。但我找不到我想要的東西。如何從另一個c文件輸入輸出?

+2

我想你的意思是「我怎樣才能把另一個程序的輸出作爲我的輸入?」如果不是,那麼我不明白你在問什麼 – 2015-03-31 01:18:02

+0

目前還不清楚你要求什麼,但是如果你試圖將輸出從一個程序輸入到另一個程序,爲什麼不使用[pipe](http: //en.wikipedia.org/wiki/Pipeline_%28Unix%29),就像在命令行上管道數據時一樣,例如'ls -la | more'。 – 2015-03-31 01:29:22

+0

@AjjandroDiaz是的,這就是我的意思!啊哈,對不起,我的大腦由於閱讀了許多關於C. – 2015-03-31 11:07:03

回答

2

我敢肯定有可能使用管道功能(檢查像這個網站unixwiz.net/techtips/remap-pip-fds.html這樣的東西),但你描述的聲音像另一個客戶端連接到服務器並通過套接字將字符串發送給它。使用套接字還會打開通過網絡檢查服務器字符串的功能。通常,在服務器進行錯誤/額外日誌檢查時,服務器可以通過打開日誌文件或通過套接字發送日誌文件來處理。如果安全問題存在,您可以決定將其發送給通過TLS連接使用PSK的特定客戶端。

對於TLS例子檢查出https://github.com/wolfSSL/wolfssl-examples

添加在代碼用於輸送

receiver.c

1 #include <stdio.h> 
    2 #include <stdlib.h> 
    3 #include <unistd.h> 
    4 
    5 int main() { 
    6 
    7  char buffer[1024]; 
    8 
    9  fscanf(stdin, "%s", buffer); 
10 
11  printf("receiver got data and is printing it\n"); 
12  printf("%s\n", buffer); 
13 
14  return 0; 
15 } 

sender.c

1 #include <stdio.h> 
    2 #include <stdlib.h> 
    3 #include <unistd.h> 
    4 
    5 
    6 int main() 
    7 { 
    8  FILE *output; 
    9 
10  output = popen ("./receiver","w"); 
11  if (!output) { 
12   /* error checking opening pipe */ 
13   fprintf(stderr, "could not open pipe\n"); 
14   return 1; 
15  } 
16 
17  fprintf(output, "%s", "hello_world\n"); 
18 
19  if (pclose (output) != 0) { 
20   /* error checking on closing pipe */ 
21   fprintf(stderr, " could not run receiver\n"); 
22   return 1; 
23  } 
24 
25  return 0; 
26 } 

編譯和在同一目錄中運行使用

gcc sender.c -o sender 
gcc receiver.c -o receiver 
./sender 
+0

哇,這聽起來很複雜。但是你是對的,客戶端將連接到服務器以從服務器獲取字符串並將其打印出來。我想知道是否可以使用流水線而不是通過TLS連接來完成這項工作? 如果我確實想通過TLS連接進行操作,那麼您是否有任何建議的參考?謝謝! – 2015-03-31 11:11:14

+0

嗨終極TC,編輯答案,希望它有幫助。我仍然建議使用TLS(如果擔心安全性),或者至少使用純TCP連接並通過套接字發送字符串。 – Sweetness 2015-03-31 21:20:57

+0

如果擔心安全問題,首先要擺脫的是receiver.c中第9行的緩衝區溢出漏洞。 – 5gon12eder 2015-03-31 21:23:29