#include #include int main(void) { int sd[2]; int r; struct iovec vec; struct msghdr msg = { 0 }; union { char buf[CMSG_SPACE(0)]; struct cmsghdr align; } u; struct cmsghdr* cmsg; msg.msg_iov = &vec; msg.msg_iovlen = 1; msg.msg_control = u.buf; msg.msg_controllen = sizeof(u.buf); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; cmsg->cmsg_len = CMSG_LEN(0); vec.iov_base = "hello"; vec.iov_len = 5; r = socketpair(PF_LOCAL, SOCK_STREAM, 0, sd); if (r == -1) { perror("socketpair"); return 1; } r = sendmsg(sd[0], &msg, 0); if (r == -1) { perror("sendmsg"); return 1; } r = recvmsg(sd[1], &msg, 0); if (r == -1) { perror("recvmsg"); return 1; } return 0; } /* import socket sd1, sd2 = socket.socketpair() sd1.sendmsg([b"hello"], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, b"")]) sd2.recvmsg(1) */