zoukankan      html  css  js  c++  java
  • linux无名管道

    特点

    无名管道是半双工的,也就是说,一个管道要么只能读,要么只能写

    只能在有共同祖先的进程间使用(父子进程、兄弟进程、子孙进程等)

    fork或者execve调用创建的子进程,继承了父进程的文件描述符

    通过man 2 pipe查看

           #include <unistd.h>
           int pipe(int pipefd[2]);
    

    打开两个文件描述符,保存在pipefd中,其中pipefd[0]为读端,pipefd[1]为写端

    无名管道写入操作不具有原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。

    不能使用lseek来定位

    如果函数出错,返回值为-1,并设置errno

    关闭管道用close函数

    如果只有写管道,没有读管道,内核会发送SIFPIPE信号

    #include <stdio.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    
    int main()
    {
        int pipefd[2] = {0};
    
        if (-1 == pipe(pipefd))
        {
            fprintf(stderr, "pipe: %d, %s
    ", errno, strerror(errno));
            exit(1);
        }
    
        pid_t pid = fork();
    
        if (pid < 0)
        {
            fprintf(stderr, "fork: %d, %s
    ", errno, strerror(errno));
            exit(1);
        }
        if (pid > 0)
        {
            close(pipefd[0]);
            char buf[] = "data from parent programe.";
            write(pipefd[1], buf, strlen(buf));
            close(pipefd[1]);
        }
        else
        {
            close(pipefd[1]);
            char buf[60] = {0};
            int readlen = read(pipefd[0], buf, 60);
            printf("child read length: %d, %s
    ", readlen, buf);
            close(pipefd[0]);
            wait(NULL);
        }
    
    	return 0;
    }
    

    管道局限性

    1. 只支持单向数据流
    2. 只能用于亲缘进程之间
    3. 没有名字
    4. 缓冲区有限(管道存在于内存中,创建管道时,分配缓冲区)
    5. 管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等;
  • 相关阅读:
    梯度下降
    最小二乘法模型的推导原理
    斗图啦+多线程(队列)
    scrapy错误-[scrapy.core.scraper] ERROR: Spider error processing
    python使用requests时报错requests.exceptions.SSLError: HTTPSConnectionPool
    AttributeError: module 'requests' has no attribute 'get'的错误疑惑
    *arg,**kwargs的参数作用的疑惑
    scrapy框架--新建调试的main.py文件
    Scrapy框架——安装以及新建scrapy文件
    爬虫-ajax请求遇到Unicode编码问题
  • 原文地址:https://www.cnblogs.com/zuofaqi/p/9608530.html
Copyright © 2011-2022 走看看