#include #include #include #include #include #include #include #include #include #include #include int main(int argc, char* argv[]) { int status; int server_sock; if (argc==2) { if (strcmp(argv[1], "child")==0) { printf("child started.\n"); for(int i = 0; i < getdtablesize(); i++) { if ((status = fcntl(i, F_GETFD))<0) continue; printf("child fd %d open\n", i); } sleep(10); printf("child end.\n"); exit(0); } } /* Server setup */ sockaddr_in server_sin; server_sin.sin_family = AF_INET; server_sin.sin_addr.s_addr = htonl(INADDR_ANY); server_sin.sin_port = htons(short(8888)); memset(server_sin.sin_zero, 0, sizeof(server_sin.sin_zero)); /* Server */ server_sock = socket(AF_INET, SOCK_STREAM, 0); if ((status = fcntl(server_sock, F_GETFD))<0) { printf("fcntl get:%s\n", strerror(errno)); exit(0); } printf("fcntl get %X\n", status); status |= FD_CLOEXEC; printf("fcntl set %X\n", status); if (fcntl(server_sock, F_SETFD, status)==-1) { printf("fcntl set close-exec:%s\n", strerror(errno)); exit(0); } status = bind(server_sock, (struct sockaddr *) &server_sin, sizeof(struct sockaddr)); if (status != -1) { status = listen(server_sock, SOMAXCONN); printf("server port listening.\n"); } pid_t pid; if ((pid = fork())==0) { // if (0) { printf("spawning child...\n"); status = execlp("test1","test1","child", NULL); perror("test1: "); exit(0); } else { close(server_sock); printf("server socket closed.\n"); /* now try to connect to inherited socket */ int sock; sock = socket(AF_INET, SOCK_STREAM, 0); sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); sin.sin_port = htons(short(8888)); if (connect(sock, (sockaddr*)&sin, sizeof(sin)) == 0) { printf("server process connected\n"); } else { perror("connect: "); } exit(0); } }