消息队列及管道

正好用到了,记下来

1. 消息队列

首先要定义符合要求的struct

typedef struct{
    int msg_type;
    char msg_data[128];
}MSG_DEF;

先来发送消息

MSG_DEF send_msg;
int key=8000, id;
id = msgget(key, IPC_CREAT | 0660);//不存在就创建,存在就返回
msgsnd(id, &send_msg, sizeof(send_msg.msg_data), 0);


再来接收消息

MSG_DEF recv_msg;
int key=8000, id;
id = msgget(key, IPC_CREAT | 0660);//不存在就创建,存在就返回
msgrcv(id, &recv_msg, sizeof(recv_msg.msg_data), 0, IPC_NOWAIT);//非阻塞

2. 管道

这里关注有名管道

先发送,注意open时模式的选择(O_NONBLOCK),可能会导致open file:: No such device or address,具体原因未细究

#define FIFO_SERVER "my_fifo"

unlink(FIFO_SERVER);
if(mkfifo(FIFO_SERVER, O_CREAT | O_RDWR | 0666) != 0)
    perror("mkfifo:");
fd = open(FIFO_SERVER, O_WRONLY);
if(fd< 0)
    perror("open file:");
ret = write(fd, filename, strlen(filename));
printf("send filename:[%s][%d]\n", filename, ret);
close(fd);

再来接收

char filename[128] = {0};
int fd = 0;
fd = open(FIFO_SERVER, O_RDONLY | O_NONBLOCK);
read(fd, filename, sizeof(filename));
printf("recv filename:[%s]\n", filename);
close(fd);



你可能感兴趣的:(消息队列及管道)