Linux子程序繼承父程序的檔案描述符
阿新 • • 發佈:2019-02-02
/* tcp_server.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <net/if.h> #include <signal.h> #define MAXLINE 1024 #define BACKLOG 50 int main(int argc, char** argv) { int listenfd, connfd, n = 0; struct sockaddr_in servaddr, cliaddr; pid_t pid; socklen_t clilen; signal(SIGCHLD, SIG_IGN); //避免子程序成為殭屍程序 if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ printf("create socket error: %s(errno: %d)\n",strerror(errno),errno); return -1; } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; //IPv4 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //自動填入本機的IP地址 /* if( inet_pton(AF_INET, "172.23.1.180", &servaddr.sin_addr) <= 0){ // [將“點分十進位制”ip-> 網路位元組序“整數”ip] printf("inet_pton error for %s\n","172.23.1.180"); return -1; } */ servaddr.sin_port = htons(6666); //將埠號轉換為網路位元組序 if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){ printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); return -1; } if( listen(listenfd, BACKLOG) == -1){ printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno); return -1; } printf("======waiting for client's connect requestion======\n"); while(1){ if( (connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen)) == -1){ printf("accept socket error: %s(errno: %d)", strerror(errno),errno); continue; } if ((pid = fork()) < 0) { perror("fork"); return -1; } else if (pid == 0) { //child process char buff[MAXLINE]; close(listenfd); fprintf(stdout, "Connected, client addr: %s\n", inet_ntoa(cliaddr.sin_addr)); if((n = recv(connfd, buff, MAXLINE-1, 0)) < 0) { printf("Failed to receive bytes from client\n"); return -1; } buff[n] = '\0'; fputs("recv msg from client: ", stdout); fputs(buff, stdout); while (n > 0) { if (send(connfd, buff, n, 0) != n) { printf("send msg error: %s(errno: %d)\n", strerror(errno), errno); return -1; } if((n = recv(connfd, buff, MAXLINE-1, 0)) < 0) { printf("Failed to receive bytes from client\n"); return -1; } buff[n] = '\0'; fputs(buff, stdout); } close(connfd); exit(0); } else { //parent process close(connfd); continue; } } return 0; }
客戶端程式碼tcp_client.c