Unix环境高级编程学习笔记(十二) 高级进程间通信
基于流的管道(STREAMS-Based Pipes)
所谓基于流的管道实际上就是一种全双工管道,它必须在基于流的系统上才能实现,linux 默认对它是不支持的,而同样的逻辑,我们通常可以用基于 UNIX domain 的 socket 来实现,所以这里对它只作简单介绍。
关于流机制,我在int recv_fd(int fd, char *buffer, size_t size) {struct cmsghdr *cmptr;int cmsg_len = CMSG_LEN(sizeof(int));cmptr = malloc(cmsg_len);struct iovec iov;iov.iov_base = buffer;iov.iov_len = size;struct msghdr msg;msg.msg_name = NULL;msg.msg_namelen = 0;msg.msg_iov = &iov;msg.msg_iovlen = 1;msg.msg_control = cmptr;msg.msg_controllen = cmsg_len;int len = recvmsg(fd, &msg, 0);if (len < 0) {printf("receve message error!\n");exit(0);}else if (len == 0) {printf("connection closed by server!\n");exit(0);}buffer[len] = '\0';int cfd = -1;if (cmptr->cmsg_type != 0)cfd = *(int*)CMSG_DATA(cmptr);free(cmptr);return cfd;}int main() {int fd;if ((fd = cli_conn(FILE_NAME)) < 0) {printf("connect error!\n");exit(fd);}char buffer[BUF_SIZE];printf("input:");fgets(buffer, BUF_SIZE, stdin);buffer[strlen(buffer) - 1] = '\0';int len = send(fd, buffer, strlen(buffer), 0);if (len < 0) {printf("send error!\n");exit(len);}int cfd = recv_fd(fd, buffer, BUF_SIZE);printf("data:%s\n", buffer);if (cfd >= 0) {printf("received open file:%d\n", cfd);}return 0;}