#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_DGRAM, 0)); struct sockaddr_un addr = { .sun_family = AF_UNIX, .sun_path = NAME }; check(bind(sock, (struct sockaddr*)&addr, sizeof(addr))); struct sockaddr_un client_addr; socklen_t client_addr_len; printf("[parent] waiting for a message...\n"); char buf[10]; ssize_t r; check(r = recvfrom(sock, buf, sizeof(buf) - 1, 0, (struct sockaddr*)&client_addr, &client_addr_len)); buf[r] = '\0'; printf("[parent] received %ld bytes: %s\n", r, buf); check(r = sendto(sock, buf, r - 1, 0, (struct sockaddr*)&client_addr, client_addr_len)); printf("[parent] exiting\n"); } void child() { int sock; check(sock = socket(AF_UNIX, SOCK_DGRAM, 0)); struct sockaddr_un addr = { .sun_family = AF_UNIX, .sun_path = "\0" }; struct sockaddr_un dest = { .sun_family = AF_UNIX, .sun_path = NAME }; check(bind(sock, (struct sockaddr*)&addr, sizeof(addr))); printf("[child] waiting 1 sec...\n"); sleep(1); check(sendto(sock, "hello", 5, 0, (struct sockaddr*)&dest, sizeof(dest))); printf("[child] msg sent, avaiting response\n"); struct sockaddr_un client_addr; socklen_t client_addr_len; char buf[10]; ssize_t r; check(r = recvfrom(sock, buf, sizeof(buf) - 1, 0, (struct sockaddr*)&client_addr, &client_addr_len)); buf[r] = '\0'; printf("[child] received %ld bytes: %s\n", r, buf); printf("[child] exiting\n"); } int main() { int pid; check(pid = fork()); if (pid != 0) { parent(); } else { child(); } return 0; }