2017-03-15 274 views
0

銘記沒有鍵盤輸入與多客戶端Unix域套接字溝通,我想創建一個文件描述符替換標準輸入。創建文件描述符替換標準輸入(在選擇())

對於多客戶端插口,您必須將標準輸入的文件描述符(即0與FD_SET(0, &readfds))添加到readfds以鍵盤輸入(FD_ISSET(0, &readfds))發送到服務器。由於我不想每次啓動我的客戶端時都要編寫代碼,我想用自定義代碼替換此文件描述符(通過從另一個程序寫入此文件)。

我檢查了Create a file descriptor創建兩個方案:

一個寫入到文件描述符:

int main() { 
    char buffer[] = "test"; 
    int fd = open("sample.dat", O_WRONLY | O_CREAT, 0666); 
    dup2(fd, 5); 

    if(write(5, buffer, 4) < 0) 
     fprintf(stderr, "write %s\n", strerror(errno)); 

    close(5);  
    return 0; 
} 

而另外一個,從記載:

int main() { 
    char buffer[4]; 
    int fd = open("sample.dat", O_RDONLY); 
    dup2(fd, 5); 

    for(;;) { 
     if(read(5, buffer, 4) < 0) 
      fprintf(stderr, "read %s\n", strerror(errno)); 

     printf("%s\n", buffer); 
     sleep(1); 
    } 

    return 0; 
} 

我的問題是:是否有可能使這個文件描述符爲標準輸入樣?我的意思是實際上我的第二個程序無休止地讀取「測試」,因爲(當然)sample.dat仍然包含「test」,但是我想在讀取它之後刪除它。

+0

這不是很清楚你問 - 你是什麼「標準輸入狀」是什麼意思?當你從標準輸入讀的東西你讀它只有一次, –

+0

@ChrisTurner不是不休,因爲標準輸入「刪除」 /「清除」(我不知道它究竟是如何工作的),一旦被讀取 – Rallph

回答

0

如果我理解正確的,你想傳達給程序誰只能在標準輸入讀取。 你有兩種方法在stdin中寫入:第一種方法是使用鍵盤,第二種方法是使用write()

#include <unistd.h> 
#include <string.h> 

int   main(void) 
{ 
    char *s = "what you want to write"; 
    write(STDIN_FILENO, s, strlen(s)); 
    return (0); 
} 

這個程序會寫在標準輸入中,就像你用鍵盤寫的一樣。此外,你會看到你的命令行界面上打印的字符串。

+0

我已經嘗試過將其替換通過'寫',但它出現'FD_ISSET'(http:// man7。org/linux/man-pages/man2/select.2.html)不接受它 – Rallph

+0

你的意思是做FD_ISSET(0,set)? – tfontain

+0

是的,但通過替換0(因爲我不想鍵盤輸入)其他任何東西(如另一個文件描述符) – Rallph

0

的問題是不是你正在閱讀的「測試」不斷,那就是你不處理呼叫到read()正常。雖然你正在檢查它沒有返回錯誤,但你沒有看到有多少字節被讀入。read()並不是null-終止讀入的字符串,所以你應該實際存儲返回值並使用它來放置你的緩衝區中的NUL。否則,由於緩衝區中沒有任何內容正在改變,因此它會顯示爲您重複閱讀相同的文本。

int err=read(fd, buffer, 4); 
    if(err < 0) 
     { 
     fprintf(stderr, "read %s\n", strerror(errno)); 
     } 
    else 
     { 
     buffer[err]='\0'; 
     } 

如果你做出這種改變,你會發現,你只能在「測試」一次讀過之後,你沒有讀什麼更

注意:您不需要對dup2()的調用 - 這只是爲了將文件描述符複製到已知值。您可以像調用中那樣使用fd來讀取/寫入數據。

+0

何是它的作品謝謝,它不會永遠讀「測試」,但..當我通過寫「tess」更新fd時,它會一直讀取任何內容。如果我「CTRL + C」並重新啓動它,它只會讀取「tess」 – Rallph

相關問題