編程小結(2)

dupdup2函數(作爲文件重定向)

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服務器的工作原理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章