dup和dup2函数(作为文件重定向)
int dup(int oldfd); int dup2(int oldfd, int newfd); | #include <unistd.h> |
int dup3(int oldfd, int newfd, int flags); | #include <fcntl.h> #include <unistd.h> |
dup创建一个新的文件描述符,该文件描述符和原有文件描述符指向相同的文件、管道或者连接。且返回值为系统当前可用最小整数值。调用失败返回-1值。
CGI服务器工作原理 |
1 #include<sys/socket.h> 2 #include<netinet/in.h> 3 #include<arpa/inet.h> 4 #include<asose(STDOUT_Fert.h> 5 #include<stdio.h> 6 #include<unistd.h> 7 #include<stdlib.h> 8 #include<errno.h> 9 #include<string.h> 10 int main(int argc,char **argv) 11 { 12 if(argc<2) 13 { 14 printf("usage: %s ip_address port_number\n",argv[0]); 15 return 1; 16 } 17 const char *ip=argv[1]; 18 int port=atoi(argv[2]); 19 struct sockaddr_in address; 20 memset(&address,0,sizeof(address)); 21 inet_pton(AF_INET,ip,&address.sin_addr); 22 address.sin_port=htons(port); 23 address.sin_family=AF_INET; 24 int sock=socket(AF_INET,SOCK_STREAM,0); 25 assert(sock>=0); 26 int ret=bind(sock,(struct sockaddr*)&address,sizeof(address)); 27 assert(ret!=-1); 28 ret=listen(sock,5); 29 assert(ret!=-1); 30 struct sockaddr_in client; 31 socklen_t client_len; 32 int connfd=accept(sock,(struct sockaddr*)&client,&client_len); 33 if(connfd<0) 34 printf("connect error is:%d!\n",errno); 35 else 36 { 37 close(STDOUT_FILENO); 38 dup(connfd); 39 printf("abcd\n"); 40 close(connfd); 41 } 42 close(sock); 43 return 0; 44 } |
关闭标准输出文件描述符STDOUT_FILENO(值为1),然后复制socket文件描述符connfd。因为dump返回系统中可用最小文件描述符,所以返回的实际值为1.这样服务器输出到标准输出的内容就会直接发送到与客户连接对应的socket上。这就是CGI服务器的工作原理。 |