2015-12-25 85 views
2

我有一個與fifos和write()read()函數有關的問題。我通過mkfifo()函數創建fifo,然後使用fork()生成兩個進程:第一個通過write()打開並在fifo上寫入;另一個打開並讀取read()。 我的問題是,在標準輸出寫入write(),並且read()等待我在stdin上寫入內容並按Enter鍵,就像scanf()一樣,因此不使用fifo。我真的不知道該怎麼做,我已經嘗試過任何東西,至今沒有在互聯網上發現任何相關問題。 我使用的是gcc編譯器和Xubuntu 15.10。write()和read()不能在stdio而不是fifo上工作

過程發生器

int main (void) { 

    int f = mkfifo("try", S_IRUSR | S_IWUSR); 
    if (f < 0) 
     printf("mkfifo went fine\n"); 
    else 
     printf("mkfifo went wrong\n"); 
    pid_t fo = fork(); 
    switch (fo) { 
    case -1: 
     printf("err\n"); 
    case 0: 
     execlp("prova_fifo2", "prova_fifo2", NULL); 
    default: 
     execlp("prova_fifo", "prova_fifo", NULL); 
    } 

    return (0); 
} 

作家(又名prova_fifo)

int main (void) { 

    int fd; 
    if (fd = open("try", O_WRONLY) == -1) 
     printf("Error opening FIFO\n"); 

    char buf[6]; 
    sprintf(buf, "hello"); 
    int writer = write(fd, buf, strlen(buf)); 
    printf("%d", writer); 
    return (0); 
} 

閱讀器(也稱爲prova_fifo2)

int main (void) { 

    int fd; 
    if (fd = open("try", O_RDONLY) ==-1) 
    printf("Errore in apertura FIFO\n"); 

    char buf[6]; 
    read(fd,&buf, strlen(buf)); //tried removing the "&", didn't work 
    printf("READ: %s", buf); 
    return (0); 
} 

注意我包括所有必要的庫,代碼編譯和運行。我唯一的問題是上面提到的問題。

+0

'讀(FD,與BUF ,strlen(buf));'這個buff是沒有意義的,aand strlen()可以做可怕的事情,如果它沒有找到一個0.同樣:read()*可以*讀取超過實際大小的小緩衝區 – wildplasser

+0

以'if(f <0)'開頭的代碼塊1)如果'f'小於0,則調用mkfifo()失敗。在這種情況下,調用:'perror(mkfifo failed「); exit(EXIT_FAILURE);'。因爲如果函數失敗,沒有理由繼續執行代碼,並且調用perror()會輸出系統認爲問題是: – user3629249

+0

當對'execlp()'的調用失敗時,該調用將返回。所以每次調用'execlp()'後面應該跟一個類似的內容:'perror(「execlp failed」); exit(EXIT_FAILURE);' – user3629249

回答

1

這是一個operator precedence問題,表達fd=open("try", O_WRONLY)==-1相當於fd=(open("try", O_WRONLY)==-1)這絕對不是你想要的,因爲這將在open(...)==-1結果分配給fd這將是錯誤的(即0這是標準文件描述符輸入)如果可以找到該文件,並且1如果文件不能找到。您需要做的是(fd=open("try", O_WRONLY))==-1

+0

謝謝!這固定它!這太簡單了! –

1

對於未初始化的char數組,您無法明智地調用strlen()。你應該這樣做:

read(fd, buf, sizeof(buf)); 

改爲。

注意read()不會零終止您的陣列,並printf()預計將收到這樣的事情%s,所以你可能想整個事情改變爲:

char buf[7] = {0}; 
if (read(fd, buf, sizeof(buf) - 1) > 0) { 
    printf("READ: %s\n", buf); 
} 
+0

謝謝,我發佈的代碼只是我正在開發的真正的「巨大」代碼的一個樣本。 –

相關問題