Linux网络编程之多进程-阿里云开发者社区

开发者社区> feilengcui008> 正文

Linux网络编程之多进程

简介:
+关注继续查看

多进程模型

多进程模型下,注意如何在进程之间通信以及孤儿进程和僵尸进程的处理,可以外配上进程池作为计算任务/异步任务的处理。

//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);
        }
    }
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Linux下apache服务器安装,sqlite安装,apache启动,关闭,重启,编写cig程序进行测试,浏览器访问cig程序
 1安装ubuntu 14.04 64位操作系统 2安装apache和sqllite以及依赖的sqllite开发库 3配置目录 /etc/apache2 4 html页面目录 var/www/ 5 cgi-bin目录 /usr/lib/cgi-bin 6日志文件:/var/log/apache2 7站点配
1905 0
《UNIX网络编程 卷2:进程间通信(第2版)》——1.8 书中IPC例子索引表
生产者-消费者:一个或多个线程或进程(生产者)把数据放到一个共享缓冲区中,另有一个或多个线程或进程(消费者)对该共享缓冲区中的数据进行操作。序列号持续增1:一个或多个线程或进程给一个共享的序列号持续增1。该序列号有时在一个共享文件中,有时在共享内存区中。
1069 0
《UNIX网络编程 卷2:进程间通信(第2版)》——1.7 Unix标准
Posix是“可移植操作系统接口”(Portable Operating System Interface)的首字母缩写。它并不是一个单一标准,而是一个由电气与电子工程师学会即IEEE开发的一系列标准。
1424 0
循序渐进学编程
软件开发人员是一个日新月异的领域—–IT中的大师,今天的编程方式与明天的编程或许截然不同,技术在不断地革新,新语言、新平台的如雨后春笋般出现、更好的解决方案的冒出,因此我们需要跟得上节奏,我们别无选择,唯有努力提高自己。
24 0
《UNIX网络编程 卷2:进程间通信(第2版)》——1.9 小结
各种类型IPC的持续性可以是随进程持续的、随内核持续的或随文件系统持续的,这取决于IPC对象存在时间的长短。在为给定的应用选择所用的IPC类型时,我们必须清楚相应IPC对象的持续性。
1222 0
Spark学习之编程进阶——累加器与广播(5)
Spark学习之编程进阶——累加器与广播(5) 1. Spark中两种类型的共享变量:累加器(accumulator)与广播变量(broadcast variable)。累加器对信息进行聚合,而广播变量用来高效分发较大的对象。 2. 共享变量是一种可以在Spark任务中使用的特殊类型的变量。 3. 累加器的用法: 通过在驱动器中调用SparkContex
1374 0
+关注
feilengcui008
在校代码狗
55
文章
3
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载