Linux进程间通信---命名管道

进程间通信:命名管道

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

const char* path = "/tmp/msgfifo";
int fd = -1;
fd_set read_set;
fd_set write_set;

struct msg_pkg
{
    int pid;
    int size;
    char data[1024];    
    /* data */
};

int main()
{
    fd = open(path, O_RDWR);
    if (fd < 0) {
        printf("open fifo failed.\n");
        return 0;
    }

    FD_ZERO(&read_set);
    FD_SET(fd, &read_set);
    long long int cnt = 0;

    while (1) {
        int ret = select(fd + 1, &read_set, NULL, NULL, NULL);
        if (ret <= 0) {
            continue;
        }
        
        struct msg_pkg msg = {0};
        if (FD_ISSET(fd, &read_set)) {
            ret = read(fd, &msg.pid, sizeof(msg.pid));
            if (ret <= 0) {
                printf("read pid failed.\n");
            }

            ret = read(fd, &msg.size, sizeof(msg.size));
            if (ret <= 0) {
                printf("read data len failed.\n");
            }

            ret = read(fd, msg.data, msg.size);
            if (ret <= 0) {
                printf("write msg data failed.\n");
            }
            printf("pid: %d, size:%d, data:%s\n", msg.pid, msg.size, msg.data);
        }
        sleep(1);
    }

    return 0;
}
#include <sys/time.h>  
#include <stdio.h>  
#include <sys/types.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
#include <assert.h>  
#include <sys/inotify.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

const char* path = "/tmp/msgfifo";
int fd = -1;
fd_set read_set;
fd_set write_set;

struct msg_pkg
{
    int pid;
    int size;
    char data[1024];    
    /* data */
};

int main()
{
    if (mkfifo(path, 0777) == -1 && (errno != EEXIST)) {
        printf("create fifo failed\n");
        return 0;
    }

    fd = open(path, O_RDWR);
    if (fd < 0) {
        printf("open fifo failed.\n");
        return 0;
    }

    FD_ZERO(&write_set);
    FD_SET(fd, &write_set);
    long long int cnt = 0;
    struct msg_pkg msg = {0};
    msg.pid = getpid();

    while (1) {
        int ret = select(fd + 1, NULL, &write_set, NULL, NULL);
        if (ret <= 0) {
            continue;
        }

        if (FD_ISSET(fd, &write_set)) {
            ret = sprintf(msg.data, "%s: %lld", "Hello world", cnt);
            if (ret <= 0) {
                printf("formate string failed.\n");
                break;
            }

            msg.size = strlen(msg.data);
            ret = write(fd, &msg, msg.size + sizeof(int) * 2);
            if (ret <= 0) {
                printf("write fifo buffer failed.\n");
            }
            printf("send msg: pid: %d, size: %d, data:%s.\n", msg.pid, msg.size, msg.data);
            cnt++;
        }
        sleep(1);
    }

    return 0;
}
posted @ 2024-10-16 16:51  cockpunctual  阅读(4)  评论(0)    收藏  举报