天天看點

程序間通訊--有名管道

有名管道特點

1.對應管道檔案,可用于任意程序間進行通訊

2.打開管道時可指定讀寫方式

3.通過檔案IO操作,内容存放在記憶體中

有名管道建立–mkfifo

#include <unistd.h>
#include <fcntl.h>
int mkfifo(const char* path, mode_t mode);
           

1.成功時傳回0,失敗時傳回EOF

2.path建立的管道檔案路徑,之後可對檔案進行讀寫

3.mode管道檔案的權限,如0666

代碼示例

寫程式

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
    int re; 
    int fd; 
    char buf[32];
    unlink("/myfifo");
    re = mkfifo("/myfifo", 0666);
    if (re == -1) 
    {   
        perror("mkfifo");
        return -1;                                                                                                                                      
    }   

    fd = open("/myfifo", O_WRONLY|O_CREAT|O_TRUNC);
    if (fd < 0)
    {   
        perror("open");
        return -1; 
    }   
    strcpy(buf, "fifo write test");
    
    while (1)
    {
        write(fd, buf, strlen(buf));
        sleep(1);
    }

    return 0;
} 
           

讀程式

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>                                                                                                                                     
#include <fcntl.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
    int re; 
    int fd; 
    char buf[32];

    fd = open("/myfifo", O_RDONLY);
    if (fd < 0)
    {   
        perror("open");
        return -1; 
    }   

    while (1) 
    {   
        read(fd, buf, 32);
        printf("%d\n", strlen(buf));
        printf("%s\n", buf);
        memset(buf, 0, 32);
        sleep(1);
    }   
    
    return 0;
}
           

繼續閱讀