Many other answers mention using some kind of protocol for your data, and I think this is the right approach. This protocol can be as simple or complex as possible. I have provided some examples that may be useful 1 .
In the simple case, you can only have a byte of length followed by a byte of data (for example, string C).
+ -------------- +
| length byte |
+ -------------- +
| data byte (s) |
+ -------------- +
Writer:
uint8_t foo[UCHAR_MAX+1]; uint8_t len; int fd; mkfifo("/tmp/myfifo", 0660); fd = open("/tmp/myfifo", O_WRONLY); memset(foo, UCHAR_MAX+1, 0); len = (uint8_t)snprintf((char *)foo, UCHAR_MAX, "Hello World!"); write(fd, len, 1); write(fd, foo, strlen(foo));
Reader:
uint8_t buf[UCHAR_MAX+1]; uint8_t len; int fd; fd = open("/tmp/myfifo", O_RDONLY); memset(buf, UCHAR_MAX+1, 0); read(fd, len, 1); read(fd, buf, len);
In a more complex case, you may have a byte of length followed by data bytes containing a simpler string C.
+ ---------------- +
| length byte |
+ ---------------- +
| data type byte |
+ ---------------- +
| data byte (s) |
+ ---------------- +
General heading:
#define FOO_TYPE 100 #define BAR_TYPE 200 typedef struct { uint8_t type; uint32_t flags; int8_t msg[20]; } __attribute__((aligned, packed)) foo_t; typedef struct { uint8_t type; uint16_t flags; int32_t value; } __attribute__((aligned, packed)) bar_t;
Writer:
foo_t foo; unsigned char len; int fd; mkfifo("/tmp/myfifo", 0660); fd = open("/tmp/myfifo", O_WRONLY); memset(&foo, sizeof(foo), 0); foo.type = FOO_TYPE; foo.flags = 0xDEADBEEF; snprintf(foo.msg, 20-1, "Hello World!"); len = sizeof(foo); write(fd, len, 1); write(fd, foo, sizeof(foo));
Reader:
uint8_t buf[UCHAR_MAX+1]; uint8_t len; uint16_t type; union data { foo_t * foo; bar_t * bar; } int fd; fd = open("/tmp/myfifo", O_RDONLY); memset(buf, UCHAR_MAX+1, 0); read(fd, len, 1); read(fd, buf, len); memcpy(&type, buf, sizeof(type)); switch(type) { case FOO_TYPE: data.foo = (foo_t)buf; printf("0x%08X: %s\n", data.foo.flags, data.foo.msg); break; case BAR_TYPE: data.bar = (bar_t)buf; printf("0x%04X: %d\n", data.bar.flags, data.bar.value); break; default: printf("unrecognized type\n"); }
1 - This code has been written from memory and not verified.