成人在线你懂的-成人在线免费小视频-成人在线免费网站-成人在线免费视频观看-日韩精品国产一区二区-日韩精品国产一区

掃一掃
關注微信公眾號

介紹守護進程XINETD與SOCKET程序的含義2
2007-06-26   中國IT實驗室

6.xinetd 的工作原理

通過配置xinetd,然后查看相應的套接字和進程,可以看出,xinetd是這樣工作的(針對tcp服務)

A.啟動時讀取/etc/xinetd.conf文件并為文件中指定的所有服務創建相應的套接字(流或數據報),xinetd能處理的服務的數目依賴于所創建的套接字數目。每個新創建的套接字都被加入到select調用所用到的描述符集中。

B.對每一個套接字調用bind,綁定服務端口(/etc/services中定義),端口號通過調用getservbyname獲得。

C.所有套接字建立后,調用select等待它們變為可讀,當tcp套接字上有數據報到來時變為可讀。xinetd在大部分時間阻塞在select的調用處;

D.xinetd守護進程fork,由子進程處理服務請求;子進程關閉除了要處理的套接字之外的所有描述字,子進程三次調用dup2,把套接字描述字復制到0、1、2,然后關閉原套接字;以后程序對套接字操作就是對0、1、2進行操作;子進程exec執行相應的服務器程序,并將配置文件中的參數傳遞。

E. 因為tcp服務器通常設置nowait標記,表示xinetd在該套接字上再次選擇之前,必須等待在該套接字上服務的子進程終止。所以,父進程中的fork返回時,把子進程的進程號記錄下來,這樣,在子進程終止時,父進程可以用waitpid的返回值查知是那一個子進程;父進程用FD_CLR宏關閉select使用的描述字集中與這個套接字對應的位,以便不對該套接字select;當子進程終止時,父進程收到一個SIGCHLD信號,父進程的信號處理程序得到終止子進程的進程號,父進程通過打開描述字集中對應的位恢復對該套接字的select。

7.重新實現的XINETD超級守護程序

A.程序利用上面的原理在思路上重新實現了超級守護進程。

B.程序在一些地方只是概念性的代碼,完全實現還有待補充。

C.程序能演示XINETD 的功能,但是在注釋有BUG 和NOTE 的地方還需改進

D.這是一個總結性的資料,參考了“利用INETD實現UDP守護進程“和“www.douzhe.com“上的文章。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

#include<netinet/in.h>
#include<sys/socket.h>

#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>

#include<errno.h>
#include <sys/ioctl.h>
//為每一個服務分配一個包含socket,及路徑的信息結構。
struct param{
  int   sock;      //BIND的套接字     
  char  path[256]; //服務程序 路徑   
  pid_t  pid ;     //CHILD 進程ID    
  struct param *next;  
}

fd_set readfds;
struct param *phead,*ptail,*p;

/*
 響應子進程結束的信號函數;
 如果服務中wait=yes;
 則bind socket 必須等到子進程結束才能監聽下一個請求
*/
void signal_handler(int signum)
{
  pid_t pid;
 
  pid= waitpid(-1,NULL,WUNTRACED);
 
  for(p=phead;p!=NULL;p=p->next)
      if(p->pid==pid)
 {
          //FD_SET(p->sock,&readfds);
          printf("child exit  pid= %d\n",pid);
          break;
        }
  signal(SIGCHLD,signal_handler);
}    


int main(int argc,char *argv[])
{
  int sock,ss;
  int nret;
  int sock_len;
  struct sockaddr_in addr;  
  struct sockaddr_in addr_clt;  
  FILE *file;
  fd_set testfds;

  sock_len=sizeof(addr);
  
 
  p=(struct param*)malloc(sizeof(struct param));
  ptail=p;
  phead=NULL;


  
  p->sock=socket(AF_INET,SOCK_STREAM,0);
     //  file=fopen("/etc/xinetd.conf","r");
     //  while(1)//省略從"/etc/xinetd.conf"文件中讀每一個服務并啟動
  {
  addr.sin_family=AF_INET;
  addr.sin_addr.s_addr=htonl(INADDR_ANY); 
  addr.sin_port=htons(9734);//從“/etc/service”文件中讀服務的端口號 getservbyname;
  bind(p->sock,(struct sockaddr *)&addr,sock_len);
  listen(p->sock,5); 

   FD_ZERO(&readfds);
   FD_SET(p->sock,&readfds);
   
    strcpy(p->path,"~/socket/");//省略從"/etc/xinetd.conf"文件中讀每一個服務的路徑
   if(phead==NULL)
    {
      p->next=NULL;
      phead=ptail=p;        
      printf("phead==null\n");
    }
  else
    { 
      ptail->next=p;
      ptail=p;
      ptail->next=NULL;

    }
   printf("path=%s,sock=%d\n",phead->path,phead->sock);
 }
  

  while(1)
{
  int fd;
  int clientfd;
  int n;
  pid_t pid;
  int flag=0;

  testfds=readfds;
  
   nret=select(FD_SETSIZE,&testfds,NULL,NULL,NULL);
   //if(nret<0){perror(strerror(errno));exit(5);}// bug 
1:如果子進程END,會顯示“interrupt system call”錯誤。 for(fd=0;fd<FD_SETSIZE;fd++) if(FD_ISSET(fd,&readfds)) { //bug 2:第一次接收到串“sock addr=3.190.0.64,client sock=4”
以后用LOOPBACK 連接返回為"127.0.0.1" clientfd=accept(fd,(struct sockaddr*)&addr_clt,&n); printf("sock addr=%s,client sock=%d\n",
     inet_ntoa(addr_clt.sin_addr),clientfd); pid=fork(); switch(pid) { case -1: perror("error"); exit(5); case 0: //dup2(clientfd,stdin); //dup2(clientfd,stdout); //dup2(clientfd,stderr); //close(clientfd); for(p=phead;p!=NULL;p=p->next) if(p->sock==fd) { printf("child runing \n"); //execve(); //note 1:未調用SERVER PATH(FILE) } sleep(1); exit(5); default:// >0 close(clientfd); if(flag) //note 2: 由service name 的wait 標志決定 FD_CLR(fd,&readfds); for(p=phead;p!=NULL;p=p->next) if(p->sock==fd) { p->pid=pid; printf("sock:%d, child pid=%d\n",p->sock,p->pid); } signal(SIGCHLD,signal_handler);//note 3:放到開始,還是這兒呢? break; } } } }

熱詞搜索:

上一篇:介紹守護進程XINETD與SOCKET程序的含義1
下一篇:實用技巧:Linux系統下查CPU個數的方法

分享到: 收藏
主站蜘蛛池模板: 王艺潼| 局外人电影| 军犬麦克斯| 超薄轻舞玉女女裤广场舞| 从亘古到永远| 调教vk| 孩子身高不达标| 红灯区未删减版| 秦时明月动画片| 庞敏| 五年级上册第一单元数学试卷| 夜夜女人香| 《灿烂的季节》大结局| 青春修炼手册歌词全部| 黄色网址视频| 九九九九九九九伊人| 即便是爸爸也想恋爱| 三年电影免费高清完整版| 坏种2| 摘抄现代诗| 甜蜜都市| 基础设施建设产业市场| 黄视频免费在线| 中川翔子| 家族荣誉4| jar of love完整版| 舞法天女朵法拉第二季免费观看全集| 鬼迷心窍1994| 如如123| 广西百色地图| 谈判专家豆瓣| 男女拍拍拍拍拍拍| 花式特殊符号可复制| 我的孩子我的家三观尽毁| 小学道德与法治课程标准2023版| 四个房间电影| 新烈火情挑| 六级词汇电子版| 香港毛片免费看| 血色恶魔| 误杀2演员|