利用inetd启动守护进程的方法:
1.编写服务器程序:
【1】cd /home/xfn
【2】vi abc.c
#include <stdio.h>
int main()
{
char buf[] = "Hello!";
write(0, buf, sizeof(buf));
//write(1, buf, sizeof(buf)); //0,1,2都重定向到了与客户端建立的socket之上,这里实际上就是往socket中写
//write(2, buf, sizeof(buf));
//read(0, buf, sizeof(buf));//0,1,2都重定向到了与客户端建立的socket之上,这里实际上就是从socket中读
//read(1, buf, sizeof(buf));
read(2, buf, sizeof(buf));
write(0, buf, sizeof(buf));
return 0;
}
【3】gcc -o abc abc.c
这样就生成了可执行文件/home/xfn/abc。
2.进行服务设置:
【1】vi /etc/services,添加如下内容:
www 17777/tcp
其中www表示服务名,17777是服务的端口,tcp是服务的协议。
【2】cd /etc/xinetd.d/
【3】vi www,文件名并不一定要与服务名相同:
service www
{
disable = no
port = 17777
socket_type = stream
protocol = tcp
user = root
server = /home/xfn/abc
type = UNLISTED
wait = no
}
【4】killall -HUP xinetd
【5】netstat -na | grep 17777
tcp 0 0 0.0.0.0:17777 0.0.0.0:* LISTEN
注意,此时必须存在文件/home/xfn/abc,否则有可能netstat -na | grep 17777会看不到任何信息。
3.编写客户端:
【1】客户端代码如下:vi test.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <strings.h>
int main()
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_port = htons(17777);
address.sin_addr.s_addr = htonl(INADDR_ANY);
if (connect(sockfd, (struct sockaddr*)&address, sizeof(address)) == 0)
{
char buf[1024] = {0};
read(sockfd, buf, sizeof(buf));
printf("%s/n", buf);
bzero(buf, sizeof(buf));
write(sockfd, "www", 3);
read(sockfd, buf, sizeof(buf));
printf("%s/n", buf);
}
else
printf("connetc error!/n");
return 0;
}
【2】编译:gcc -o test test.c
【5】执行:./test
Hello!
重启服务器之后,运行test仍然能输出Hello!,即守护进程仍然有效!