Linux网络编程之多进程
来源:互联网 发布:思途旅游cms 6.0 下载 编辑:程序博客网 时间:2024/05/18 02:24
多进程模型
多进程模型下,注意如何在进程之间通信以及孤儿进程和僵尸进程的处理,可以外配上进程池作为计算任务/异步任务的处理。
//fork server#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netdb.h>#include <stdlib.h>#include <netinet/in.h>#include <sys/wait.h>#include <signal.h>void run();int main(int argc, char *argv[]){ run(); return 0;}void handle_client_socket(int clientfd){ //read from client socket char readbuf[1024]; ssize_t readlen; while(1){ readlen = read(clientfd, readbuf, sizeof(readbuf)); if (readlen==-1){ perror("read client error"); close(clientfd); return; }else if(readlen==0){ break; }else{ fwrite(readbuf, readlen, 1, stdout); //write back to client if(write(clientfd, readbuf, readlen)==-1){ perror("write back to client error"); close(clientfd); return; } } } close(clientfd);}void reap(int signum){ while(waitpid(-1, NULL, WNOHANG)>0); return;}void run(){ //get hostent struct hostent *h = gethostbyname("127.0.0.1"); if(!h){ perror("resolve host failed"); exit(EXIT_FAILURE); } //create server socket int fd = socket(AF_INET, SOCK_STREAM, 0); if(fd==-1){ perror("socket create failed"); exit(EXIT_FAILURE); } //server bind struct sockaddr_in server; server.sin_family = AF_INET; server.sin_addr = *(struct in_addr *)h->h_addr_list[0]; server.sin_port = htons(8000); if(bind(fd, (struct sockaddr *)&server, sizeof(server))==-1){ perror("bind error"); close(fd); exit(EXIT_FAILURE); } int reuse = 1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))<0){ perror("error setsockopt"); exit(EXIT_FAILURE); } //server listen if(listen(fd,20)==-1){ perror("listen error"); close(fd); exit(EXIT_FAILURE); } signal(SIGCHLD,reap); //server loop while(1){ //struct sockaddr_in client; struct sockaddr_storage client; int clientfd; socklen_t socklen = sizeof(client); clientfd = accept(fd, (struct sockaddr *)&client, &socklen); if (clientfd==-1){ perror("error accept"); close(fd); exit(EXIT_FAILURE); } pid_t pid = fork(); if(pid==-1){ perror("fork error"); close(fd); exit(EXIT_FAILURE); } if (pid==0){ //close parent listening fd close(fd); handle_client_socket(clientfd); exit(EXIT_SUCCESS); } if (pid>0){ //close client fd close(clientfd); } }}
0 0
- Linux网络编程之多进程
- Linux网络编程之多进程模型编程与一个使用进程池实现的CGI服务器
- linux网络编程之多播
- Linux网络编程之多播
- Linux网络编程之多播
- Linux网络编程之多播
- Linux网络编程之多播
- Linux网络编程之多线程
- Linux网络编程之多播
- linux网络编程之多线程多进程服务器与进程线程池
- linux高性能服务器编程之多进程
- linux下C 编程学习之多进程编程(一)
- Linux并发服务器编程之多进程并发服务器
- Linux下socket编程之多进程TCP服务器端
- ios 网络编程之多线程
- linux网络编程多进程并发服务器
- linux网络编程多进程并发服务器
- Linux网络编程-自己动手写进程池
- SQL导出txt文件字段用逗号 ,隔开
- 详解“系统应用不能访问sdcard”
- CentOS6.6配置防火墙
- CCS+C6678LE开发记录11:多核协作(IPC)入门
- tcp-ip : snmp
- Linux网络编程之多进程
- ubuntu12.04LTS-ARM平台交叉编译器的制作
- CentOS7.0网络设置和域名绑定
- Shell-计算多行数值求和
- Android Volley完全解析(三),定制自己的Request
- Linux网络编程之多线程
- jquery easyui datagrid 数据绑定java版本
- WIFI从零开始学起 -- 基本内容
- ArcEngine数据编辑操作--添加点