unix网络编程卷二——进程间通信

一、简介

第一章 简介

1.1 概述

 

1.2 进程、线程与信息共享

unix网络编程卷二——进程间通信_第1张图片

unix网络编程卷二——进程间通信_第2张图片

 

 

1.3 IPC对象的持续性

unix网络编程卷二——进程间通信_第3张图片

unix网络编程卷二——进程间通信_第4张图片

 

 

 

1.4 名字空间

unix网络编程卷二——进程间通信_第5张图片

 

 

1.5 fork、exec、exit对IPC对象的影响

unix网络编程卷二——进程间通信_第6张图片

 

 

 

第二章 Posix IPC

2.1 概述

unix网络编程卷二——进程间通信_第7张图片

 

 

2.2 IPC名字

unix网络编程卷二——进程间通信_第8张图片

unix网络编程卷二——进程间通信_第9张图片

 

 

px_ipc_name函数

unix网络编程卷二——进程间通信_第10张图片

unix网络编程卷二——进程间通信_第11张图片

 

 

2.3 创建与打开IPC通道

unix网络编程卷二——进程间通信_第12张图片

unix网络编程卷二——进程间通信_第13张图片

unix网络编程卷二——进程间通信_第14张图片

unix网络编程卷二——进程间通信_第15张图片

 

 

小结

unix网络编程卷二——进程间通信_第16张图片

 

 

 

第三章 system v ipc

 

 


第二部分 消息传递

第四章 管道和FIFO

4.1 概述

unix网络编程卷二——进程间通信_第17张图片

 

 

4.2 管道

unix网络编程卷二——进程间通信_第18张图片

unix网络编程卷二——进程间通信_第19张图片

unix网络编程卷二——进程间通信_第20张图片

 

unix网络编程卷二——进程间通信_第21张图片

 

 

两个管道的客户端-服务器程序

#include"unpipc.h"

void client(int, int), server(int, int);

int main(int argc, char**argv){
    int pipe1[2], pipe2[2];
    pid_t childpid;
    Pipe(pipe1);
    Pipe(pipe2);

    if((childpid = Fork()) == 0){ //child
        Close(pipe1[1]);
        Close(pipe2[0]);

        server(pipe1[0], pipe2[1]);
        exit(0);

    }

    Close(pipe1[0]);
    Close(pipe2[1]);

    client(pipe2[0], pipe1[1]);
    Waitpid(childpid, NULL,0);
    exit(0);
}

void client(int readfd, int writefd){
    size_t len;
    ssize_t n;
    char buff[MAXLINE];

    //从标准输入读取路径名
    Fgets(buff, MAXLINE, stdin);
    len = strlen(buff);  //fgets guarantees null byte at end
    if(buff[len-1] == '\n'){
        len--;           //delete newline frim fgets
    }

    Write(writefd, buff, len);
    while((n=Read(readfd, buff, MAXLINE))>0)
        Write(STDOUT_FILENO, buff, n);

}

void server(int readfd, int writefd){
    int fd;
    ssize_t n;
    char buff[MAXLINE+1];

    //read pathname from IPC channel 
    if((n=Read(readfd, buff, MAXLINE))==0)
        err_quit("END OF FILE WHILR READING PATH");
    buff[n] = '\0'; //null terminate pathname

    if((fd =open(buff, O_RDONLY))<0){
        snprintf(buff+n, sizeof(buff)-n, "cannot open, %s\n",
            strerror(errno));
        n = strlen(buff);
        Write(writefd, buff, n);
    }else{
        while((n=Read(fd, buff, MAXLINE))>0)
            Write(writefd, buff, n);
        Close(fd);
    }
}

 

 

 

4.4 全双工管道

unix网络编程卷二——进程间通信_第22张图片

 

 

 

单个全双工管道完成双向通信代码

#include"unpipc.h"

int main(int argc, char**argv){

    int fd[2], n;
    char c;
    pid_t childpid;

    Pipe(fd);
    if((childpid = Fork()) ==0){
        sleep(3);
        if((n=Read(fd[0], &c, 1))!=1)
            err_quit("child:read returned %d",n);
        //%c是以字符形式输出,只输出一个字符;
        printf("child read %c\n",c);
        Write(fd[0],"c",1);
        exit(0);
    }

    Write(fd[1], "p", 1);
    if((n=Read(fd[1], &c, 1))!=1)
        err_quit("child:read returned %d",n);
    
    printf("parent read %c\n",c);
    exit(0);

}

 

 

 

4.5 popen和pclose函数

unix网络编程卷二——进程间通信_第23张图片

unix网络编程卷二——进程间通信_第24张图片

 

 

 

4.6 FIFO

unix网络编程卷二——进程间通信_第25张图片

unix网络编程卷二——进程间通信_第26张图片

unix网络编程卷二——进程间通信_第27张图片

 

 

 

有亲缘关系的客户端服务器

#include"unpipc.h"

#define FIFO1 "/tmp/fifo.1"
#define FIFO2 "/tmp/fifo.2"
#define	FILE_MODE	(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)

void client(int, int), server(int, int);

int main(int argc, char**argv){
    int readfd, writefd;
    pid_t childpid;

    if((mkfifo(FIFO1, FILE_MODE)<0) && (errno !=EEXIST))
        err_sys("cannot create fifo");
     if((mkfifo(FIFO2, FILE_MODE)<0) && (errno !=EEXIST)){
         unlink(FIFO1);
         err_sys("cannot create fifo");  
     }

    if((childpid = Fork()==0)){
        readfd = Open(FIFO1, O_RDONLY, 0);
        writefd = Open(FIFO2, O_WRONLY, 0);

        server(readfd, writefd);
        exit(0);
    }

    writefd = Open(FIFO1, O_WRONLY, 0);
    readfd = Open(FIFO2, O_RDONLY, 0);

    client(readfd, writefd);
    Waitpid(childpid, NULL, 0); //wait for child to terminate

    Close(readfd);
    Close(writefd);

    Unlink(FIFO1);
    Unlink(FIFO2);
    exit(0);

}

void client(int readfd, int writefd){
    size_t len;
    ssize_t n;
    char buff[MAXLINE];

    //从标准输入读取路径名
    Fgets(buff, MAXLINE, stdin);
    len = strlen(buff);  //fgets guarantees null byte at end
    if(buff[len-1] == '\n'){
        len--;           //delete newline frim fgets
    }

    Write(writefd, buff, len);
    while((n=Read(readfd, buff, MAXLINE))>0)
        Write(STDOUT_FILENO, buff, n);

}

void server(int readfd, int writefd){
    int fd;
    ssize_t n;
    char buff[MAXLINE+1];

    //read pathname from IPC channel 
    if((n=Read(readfd, buff, MAXLINE))==0)
        err_quit("END OF FILE WHILR READING PATH");
    buff[n] = '\0'; //null terminate pathname

    if((fd =open(buff, O_RDONLY))<0){
        snprintf(buff+n, sizeof(buff)-n, "cannot open, %s\n",
            strerror(errno));
        n = strlen(buff);
        Write(writefd, buff, n);
    }else{
        while((n=Read(fd, buff, MAXLINE))>0)
            Write(writefd, buff, n);
        Close(fd);
    }
}

unix网络编程卷二——进程间通信_第28张图片

unix网络编程卷二——进程间通信_第29张图片

 

 

 

无亲缘关系的客户端服务器

unix网络编程卷二——进程间通信_第30张图片

 

 

4.7 管道和FIFO的额外属性

unix网络编程卷二——进程间通信_第31张图片

unix网络编程卷二——进程间通信_第32张图片

 

 

 

4.8 单个服务器,多个客户端

unix网络编程卷二——进程间通信_第33张图片

unix网络编程卷二——进程间通信_第34张图片

 

unix网络编程卷二——进程间通信_第35张图片

 

 

拒绝服务型攻击

unix网络编程卷二——进程间通信_第36张图片

 

 

 

第五章 消息队列

5.1 概述

unix网络编程卷二——进程间通信_第37张图片

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(操作系统)