2013-07-17 19 views
0
gcc (GCC) 4.7.2 
c89 

我正在使用管道mkfifo。我有一位讀者和一位作家。使用mkfifo阻止讀取,直到寫入

我希望讀者阻止,直到文件中有東西。

有一個標誌,你可以設置O_NONBLOCK這是非阻塞模式。所以默認情況下它應該阻止讀取。

寫入文件

int main(void) 
{ 
    int fd; 
    const char *pipe_file = "../../pipe_file/file"; 
    const char *pipe_msg = "PIPE Message"; 

    LOG_INFO("Start writer"); 

    /* Create the FIFO named pipe with read/write permissions */ 
    mkfifo(pipe_file, 0666); 

    /* Write to the pipe */ 
    fd = open(pipe_file, O_WRONLY); 
    write(fd, pipe_msg, strlen(pipe_msg) + 1); 

    LOG_INFO("Terminate writer"); 

    return 0; 
} 

從文件

int main(void) 
{ 
    int fd = -1; 
    const char *pipe_file = "../../pipe_file/file"; 
#define BUF_SIZE 1024 
    char rd_buffer[BUF_SIZE]; 

    LOG_INFO("Start reader"); 

    fd = open(pipe_file, O_RDONLY); 

    do { 
     memset(rd_buffer, 0, sizeof(rd_buffer)); 
    /* I WANT IT TO BLOCK HERE, UNTIL THE FILE IS WRITTEN AGAIN */ 
     read(fd, rd_buffer, sizeof(rd_buffer)); 
     LOG_INFO("Contents of buffer [ %s ]", rd_buffer); 
    /* NO NEED TO SLEEP AS THE FILE WILL DELAY WHEN BLOCKING, I THINK */ 
    } while(1); 

    /* We're done clean up */ 
    close(fd); 
    unlink(pipe_file); 

    LOG_INFO("Terminate reader"); 

    return 0; 
} 

回答

5

閱讀你read()將在FIFO的另一端的情況下立即返回是不是在寫模式打開。嘗試先運行你的寫程序,然後看看。

欲瞭解更多信息,請點擊here