2010-08-09 60 views
3

我正在用C++編程,在LINUX下。 我有兩個獨立的進程。我應該使用命名管道提供通信。命名管道 - 寫入()和讀取()的問題

讀卡器: - 創建使用FIFO mkfifo - 狀態= mkfifo(myFIFO,0666) 使用開 - 打開所述管 - FIFO =開放(myFIFO,O_RDONLY)從管 -reads - NUM =讀(FIFO, temp,sizeof(temp))

Writer: -opens pipe - fifo = open(myFIFO,O_WRONLY); - 寫入管道 - num =寫入(fifo,string,strlen(string));

我注意到,讀取進程 返回的文件描述符和寫入過程都是0.另外,在寫入命令後,我可以在我的終端上看到應該寫入管道的字符串。我不知道它爲什麼顯示在終端上...此外,寫入的字節數爲0 ...

請你幫幫我嗎? 謝謝!!!

// read.cpp: 

#define myFIFO "/temp/FIFO" 

int main(){ 
    int num, fifo, status; 
    char temp[32]; 

    if (status = mkfifo(myFIFO, 0666) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
    } 

    if (fifo = open(myFIFO, O_RDONLY) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
    } 

    if (num= read(fifo, temp, sizeof(temp)) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
    } 

    printf("In FIFO is %s \n", temp); 
} 

而在另一個文件:

// write.cpp: 

#define myFIFO "/temp/FIFO" 

int main() { 
    int status, num, fifo; 
    char string[]="Testing..."; 

    if (fifo = open(myFIFO, O_WRONLY) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
    } 

    if (num= write(fifo, string, strlen(string)) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
    } 
} 
+1

你可以在strace下運行它併發布日誌嗎? – jpalecek 2010-08-09 12:29:49

+1

請將管道命名並打開的代碼以及讀/寫的位置發佈。 – James 2010-08-09 12:34:25

+1

發佈你的代碼,當我們看到你的問題時,它會更容易幫助你。 – 2010-08-09 12:45:11

回答

1

的問題是在你的代碼:fifo = open(myFIFO, O_WRONLY) < 0評估爲fifo = (open(myFIFO, O_WRONLY) < 0)。您得到零,因爲值open()返回的是>= 0

+0

非常感謝你! 我已經失去了3天,因爲... 現在,它的工作... – MarijaS 2010-08-09 13:38:35

7

你的代碼基本上至少有四個錯誤。創建FIFO時,必須使用由「打開」調用返回的文件描述符。但是,您和0比較,並分配一個比較一個變量,是爲了保持一個文件描述符的結果:

if (fifo = open(myFIFO, O_RDONLY) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
} 

正確的代碼應該是這樣的:

fifo = open(myFIFO, O_RDONLY); 
if (fifo < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
} 

或者這樣,如果你堅持節約一行代碼的:

if ((fifo = open(myFIFO, O_RDONLY)) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
} 

並具有完全相同的故事閱讀:

if (num= read(fifo, temp, sizeof(temp)) < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
} 

正確的代碼:

num = read(fifo, temp, sizeof(temp)); 
if (num < 0) { 
    printf("\n %s \n", strerror(errno)); 
    return 0; 
} 

在你的代碼寫入FIFO有完全相同的兩個錯誤。

+0

你是完全正確的! 我正在尋找一個錯誤,但我沒有看到這件事... 顯然,我必須練習越來越多... 謝謝! – MarijaS 2010-08-09 13:59:26

+0

@MarijaS不客氣。這是關於評估的順序。這將自然而然地帶來經驗。我建議你在學習時不要嘗試保存一行代碼:-) – 2010-08-09 15:11:41