我有一個與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);
}
注意我包括所有必要的庫,代碼編譯和運行。我唯一的問題是上面提到的問題。
'讀(FD,與BUF ,strlen(buf));'這個buff是沒有意義的,aand strlen()可以做可怕的事情,如果它沒有找到一個0.同樣:read()*可以*讀取超過實際大小的小緩衝區 – wildplasser
以'if(f <0)'開頭的代碼塊1)如果'f'小於0,則調用mkfifo()失敗。在這種情況下,調用:'perror(mkfifo failed「); exit(EXIT_FAILURE);'。因爲如果函數失敗,沒有理由繼續執行代碼,並且調用perror()會輸出系統認爲問題是: – user3629249
當對'execlp()'的調用失敗時,該調用將返回。所以每次調用'execlp()'後面應該跟一個類似的內容:'perror(「execlp failed」); exit(EXIT_FAILURE);' – user3629249