#include #include #include #include #include #include #include int main(int argc, char* argv[]) { struct mq_attr mqattrs = { .mq_maxmsg = 10, .mq_msgsize = 128, }; mqd_t mq = mq_open("/spqueue", O_RDWR | O_CREAT, 0700, &mqattrs); char buf[128]; pid_t fp = fork(); if (fp == 0) { // child int amount; while ((amount = read(0, buf, 128))) { if (amount < 128) buf[amount] = '\0'; mq_send(mq, buf, 128, 0); } } else { int fd = open(argv[1], O_WRONLY | O_TRUNC | O_CREAT, 0755); while (!waitpid(fp, NULL, WNOHANG)) { mq_receive(mq, buf, 128, NULL); write(fd, buf, strlen(buf)); } mq_getattr(mq, &mqattrs); while (mqattrs.mq_curmsgs-- > 0) { mq_receive(mq, buf, 128, NULL); write(fd, buf, strlen(buf)); } close(fd); } mq_close(mq); if (fp != 0) mq_unlink("/spqueue"); return 0; }