#include #include #include #include #include #include #include #include #define NAME "./sock" #define check(x) if ((x) == -1) { \ perror(#x); \ exit(EXIT_FAILURE); \ } void parent() { unlink(NAME); int sock; check(sock = socket(AF_UNIX, SOCK_STREAM, 0)); struct sockaddr_un addr = { .sun_family = AF_UNIX, .sun_path = NAME }; check(bind(sock, (struct sockaddr*)&addr, sizeof(addr))); check(listen(sock, 10)); struct sockaddr_un client_addr; socklen_t client_addr_len; int client_fd; printf("[parent] waiting for connection...\n"); check(client_fd = accept(sock, (struct sockaddr*)&client_addr, &client_addr_len)); printf("[parent] accepted fd=%d\n", client_fd); char buf[10]; int r; check(r = read(client_fd, buf, sizeof(buf) - 1)); buf[r] = '\0'; printf("[parent] received %d bytes: %s\n", r, buf); printf("[parent] exiting\n"); } void child() { int sock; check(sock = socket(AF_UNIX, SOCK_STREAM, 0)); struct sockaddr_un addr = { .sun_family = AF_UNIX, .sun_path = NAME }; printf("[child] waiting 1 sec...\n"); sleep(1); printf("[child] connecting to %s...\n", NAME); check(connect(sock, (struct sockaddr*)&addr, sizeof(addr))); check(write(sock, "hello", 5)); printf("[child] msg sent\n"); printf("[child] exiting\n"); } int main() { int pid; check(pid = fork()); if (pid != 0) { parent(); } else { child(); } return 0; }