进程间通信:命名管道
#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;
}