linux下的超级服务器inetd
? ? inetd服務(wù)是linux開機(jī)初始化由rc程序啟動(dòng)的一項(xiàng)守護(hù)進(jìn)程,它通過(guò)監(jiān)聽端口來(lái)啟動(dòng)各項(xiàng)服務(wù),流程 tcp/udp服務(wù)---->(5000端口來(lái)信)---->inted發(fā)現(xiàn)有來(lái)信----->啟動(dòng)相應(yīng)的服務(wù)程序, 也就是說(shuō)inted服務(wù)器充當(dāng)一個(gè)功能就是創(chuàng)建socket服務(wù)端的前半段,即創(chuàng)建socket---->bind(端口)---->監(jiān)聽---->accept(接受信號(hào)),當(dāng)來(lái)一個(gè)此端口的請(qǐng)求,他會(huì)fork+exec來(lái)執(zhí)行相對(duì)應(yīng)的服務(wù)程序.下面通過(guò)一個(gè)小例子還說(shuō)明inetd服務(wù)的流程:
①. 首先在 /etc/inetd.conf 文件中的最后一行加入
? ? ? ?ma streamtcp nowaitroot ? ?/home/human/bb ? xiao?
? ? ? ?tip: 這幾個(gè)參數(shù)是用tab鍵分開的,這個(gè)inetd.conf文件是inetd服務(wù)器的配置文件,配置好了之后需要重啟一下才能生效
? ? ? ? ? ? ?首先開機(jī)啟動(dòng)的時(shí)候,rc啟動(dòng)inetd服務(wù),此服務(wù)會(huì)讀取inetd.conf文件中的每一行來(lái)進(jìn)行監(jiān)聽,比如這一行,他會(huì)讀取第一個(gè)參數(shù) ma,發(fā)現(xiàn)是ma服務(wù)
? ? ? ? ? ? ?然后它會(huì)在 /etc/service文件中找 ma服務(wù)所對(duì)應(yīng)的端口,所以我們事先也要在/etc/service文件中填入一行 ma ? ?6234/tcp
? ? ? ? ? ? 接著有讀取了 第二第三個(gè)參數(shù), 之后創(chuàng)建socket,bind,listen, accept,第四個(gè)參數(shù)的意思就是創(chuàng)建子進(jìn)程后父進(jìn)程不用等待直接可以接受此端口接受到的下一個(gè)命令
? ? ? ? ? ? 所以 accept 之后就是fork+exec,其中 exec中的啟動(dòng)函數(shù)是第五個(gè)參數(shù)/home/human/bb 名字叫bb的進(jìn)程,第六個(gè)參數(shù)xiao不清楚,沒有試驗(yàn)出來(lái)...
? ? ? ? ? ? 其中程序bb的源碼非常簡(jiǎn)單如下: ? ?
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]) {FILE *fp;system("echo hello >> /home/human/ma.txt");return 0; } 這里就是網(wǎng)文件中打印一句話之后創(chuàng)建訪問程序(tcp)
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <arpa/inet.h> #include <netdb.h> #include <string.h> #include <stdlib.h>#define BUFLEN 255 #define SOCKADDR struct sockaddr #define SERVER_PORT 6234 int main(int argc, char** argv) {struct sockaddr_in servaddr;int sockfd, n, flag;int num1, num2;char buffer[BUFLEN];char errmsg[] = "Server does not function. /n";struct hostent *hp;if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {printf("socket creating error!/n");exit(1);};memset(&servaddr, 0, sizeof(struct sockaddr_in));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERVER_PORT);servaddr.sin_addr.s_addr=htonl(INADDR_ANY); if(connect(sockfd, (struct sockaddr *)(&servaddr), sizeof(struct sockaddr_in)) <0 ){printf("Connection Failure!/n");exit(3);} }結(jié)束語(yǔ):順便提一下為什么會(huì)有inetd服務(wù)器的原因,因?yàn)槿绻麤]有的話,假設(shè)在系統(tǒng)中有10個(gè)請(qǐng)求服務(wù)端,然后就會(huì)創(chuàng)建10個(gè)接受進(jìn)程來(lái)接受服務(wù),這樣系統(tǒng)就多了10個(gè)進(jìn)程,那么如果沒有請(qǐng)求來(lái)的話這10個(gè)進(jìn)程還在掛起狀態(tài),嚴(yán)重的浪費(fèi)了系統(tǒng)的資源, 所以人們就想用一個(gè)進(jìn)程來(lái)做監(jiān)聽,所以就出來(lái)了個(gè)inetd服務(wù)器的東西,就是說(shuō)它讀取/etc/inetd.conf文件讀取10個(gè)進(jìn)程的服務(wù)項(xiàng),然后創(chuàng)建socket等等,這樣系統(tǒng)中只是一個(gè)進(jìn)程在掛起,來(lái)請(qǐng)求時(shí),就調(diào)用相應(yīng)的任務(wù)進(jìn)程即可,這樣節(jié)省了系統(tǒng)的資源
總結(jié)
以上是生活随笔為你收集整理的linux下的超级服务器inetd的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 22 个出口节点对 Tor 网络发动中间
- 下一篇: linux系统使用ps,Linux系统p