zoukankan      html  css  js  c++  java
  • [国嵌攻略][080][无名管道通讯]

    通讯目的

    1.数据传输

    一个进程需要将数据发送给另外一个进程。

    2.资源共享

    多个进程之间共享同样的资源。

    3.通知事件

    一个进程需要向另外一个/组进程发送消息,通知它们发生了某事件。

    4.进程控制

    有些进程希望完全控制另外一个进程的执行,此时控制进程希望能够拦截另外一个进程的所有操作,并能够及时知道它的状态改变。

    通信方式

    1.无名管道(pipe):数据传输

    2.有名管道(fifo):数据传输

    3.信号(signal):通知事件

    4.消息队列

    5.内存共享

    6.信号量:资源共享

    7.套接字(socket)

    管道通信

    一个进程在管道的尾部写入数据,另一个进程从管道的头部读出数据。管道包括无名管道和有名管道两种,前者只能用于父进程和子进程之间的通信,后者可与用于运行与同一系统中的任意两个进程间的通信。

    管道通信的特点

    1.管道通信是单向的,有固定的读端和写端。

    2.数据被进程从管道读出后,在管道中该数据就不存在了。

    3.当进程去读取空管道的时候,进程会阻塞。

    4.当进程往满管道写入数据时,进程会阻塞。

    5.管道容量为64KB。

    无名管道

    在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件。无名管道的读端被视作一个文件,无名管道的写端也被视作一个文件。因此可以使用read,write,close等函数来访问无名管道。

    #include <stdio.h>
    #include <stdlib.h>
    
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    
    void main(){
        //创建管道
        int pipefd[2];
        
        pipe(pipefd);
        
        //创建进程
        int pid;
        
        pid = fork();
        
        //管道通讯
        if(pid > 0){
            //写入数据
            char wbuf[13] = "hello world!";
            
            write(pipefd[1], wbuf, 13);
            
            //等待读取
            wait(NULL);
            
            //关闭写管道
            close(pipefd[1]);
        }else if(pid == 0){
            //读取数据
            char rbuf[13];
            
            read(pipefd[0], rbuf, 13);
            
            //显示数据
            printf("%s
    ", rbuf);
            
            //关闭读管道
            close(pipefd[0]);
        }
        
        //结束进程
        exit(0);
    }
  • 相关阅读:
    为调试JavaScript添加输出窗口
    后悔自己没有学好数学
    IEnumeralbe<T>被误用一例
    开发软件真是一件有意思的事情
    在网页上实现WinForm控件:ComboBox
    WinForm异步编程中一个容易忽视的问题
    网页上的DataGridView
    用Excel生成代码
    游戏处女作 打方块
    用GDI+保存Image到流时的一个有趣现象
  • 原文地址:https://www.cnblogs.com/d442130165/p/5224099.html
Copyright © 2011-2022 走看看