进程间通信

2023-09-22 15:58:45

#include <unistd.h>

    int pipe(int pipefd[2]);

    功能:创建一个匿名管道,用于进程间通信

    参数:

        -int pipefd[2]:传出参数

            pipefd[0]对应的是管道的读端

            pipefd[0]对应的是管道的写端

    返回值:

        成功返回0,失败返回-1

管道默认是阻塞的,如果管道中没有数据,read阻塞,如果管道满了,write阻塞

    注意:匿名管道只能用于具有关系的进程之间的通信(父子进程、兄弟进程)

1.子进程写数据,父进程读数据并输出

//子进程发送数据给父进程,父进程读取到数据输出
#include <unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main() {
    //在fork之前创建管道
    int pipefd[2];
    int ret = pipe(pipefd);
    if(ret == -1) {
        perror("pipe");
        exit(0);
    }
    //创建子进程
    pid_t pid = fork();
    if(pid > 0) {
        //父进程
        //从管道读取端读取数据
        char buf[1024] = {0};
        int len = read(pipefd[0], buf, sizeof(buf));
        printf("parent recv : %s, pid: %d\n", buf, getpid());
    } else if(pid == 0){
        //子进程
        //在管道中写入数据
        char * str = "hello, i am child";
        write(pipefd[1], str, strlen(str));
    }
    return 0;
}

2.子进程持续写数据,父进程持续接收

//子进程发送数据给父进程,父进程读取到数据输出
#include <unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main() {
    //在fork之前创建管道
    int pipefd[2];
    int ret = pipe(pipefd);
    if(ret == -1) {
        perror("pipe");
        exit(0);
    }
    //创建子进程
    pid_t pid = fork();
    if(pid > 0) {
        //父进程
        //从管道读取端读取数据
        printf("i am parent process, pid: %d\n", getpid());
        char buf[1024] = {0};
        while(1) {
            int len = read(pipefd[0], buf, sizeof(buf));
            printf("parent recv : %s, pid: %d\n", buf, getpid());
        }
    } else if(pid == 0){
        //子进程
        printf("i am child process, pid: %d\n", getpid());
        while(1) {
            //在管道中写入数据
            char * str = "hello, i am child";
            write(pipefd[1], str, strlen(str));
            sleep(1);
        }
    }
    return 0;
}

3.父子进程都能读和写数据

//子进程发送数据给父进程,父进程读取到数据输出
#include <unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main() {
    //在fork之前创建管道
    int pipefd[2];
    int ret = pipe(pipefd);
    if(ret == -1) {
        perror("pipe");
        exit(0);
    }
    //创建子进程
    pid_t pid = fork();
    if(pid > 0) {
        //父进程
        //从管道读取端读取数据
        printf("i am parent process, pid: %d\n", getpid());
        char buf[1024] = {0};
        while(1) {
            //在管道中读取数据
            int len = read(pipefd[0], buf, sizeof(buf));
            printf("parent recv : %s, pid: %d\n", buf, getpid());

            //在管道中写入数据
            char * str = "hello, i am parent";
            write(pipefd[1], str, strlen(str));
            sleep(1);
        }
    } else if(pid == 0){
        //子进程
        printf("i am child process, pid: %d\n", getpid());
        char buf[1024] = {0};
        while(1) {
            //在管道中写入数据
            char * str = "hello, i am child";
            write(pipefd[1], str, strlen(str));
            sleep(1);

            //在管道中读取数据
            int len = read(pipefd[0], buf, sizeof(buf));
            printf("child recv : %s, pid: %d\n", buf, getpid());
        }
    }
    return 0;
}

4.查看管道缓冲大小

 

#include <unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int main() {
    int pipefd[2];
    int ret = pipe(pipefd);
    //获取管道大小
    long size = fpathconf(pipefd[0], _PC_PIPE_BUF);
    printf("pipe size: %ld\n", size);
    return 0;
}

更多推荐

MySQL 权限分配

有时候,您需要查看某个用户被授予的权限以便复核。MySQL允许您使用SHOWGRANTS语句来显示分配给用户帐户或角色的权限。MySQLSHOWGRANTS语句介绍以下是SHOWGRANTS语句的基本语法:SHOWGRANTS[FOR{user|role}[USINGrole[,role]...]]在这个语法中:首先,

记录一次DLL分析实战

记录一次DLL分析实战1.VT查看分析报告2.判断文件是否加壳3.查看导入函数4.查看是否有任何其他文件或基于主机的迹象5.使用工具IDAPro进行字符串分析1.VT查看分析报告virustotal全绿,没有报毒:可以看到这个dll是32位的:下面可以看它调用的其他dll:以及它对外提供的函数接口:其中RunCmd很可

Redis简介

1.Nosql作用:应对基于海量用户和海量数据前提下的数据处理问题。​常见Nosql数据库:​RedismemcacheHBaseMongoDB​特征:可扩容,可伸缩,大数据量下高性能,灵活的数据模型,高可用2.Redis特征:1.数据间没有必然的关联关系2.内部采用单线程机制进行工作3.高性能。官方提供测试数据,50

OceanBase杨传辉传递亚运火炬:国产数据库为“智能亚运”提供稳稳支持

9月14日,亚运火炬传递到了浙江台州,OceanBase的CTO杨传辉作为火炬手交接了第89棒火炬。2010年,杨传辉作为创始成员之一参与自研原生分布式数据库OceanBase。十年磨一剑,国产数据库OceanBase交出了一张优秀的成绩单:连续10年稳定支撑双11,承受住了世界级的流量洪峰和稳定性考验;刷新过TPC-

go学习-GMP模型

GMP好理解还是GPM好理解?按照上述图,从上往下,GPM更适合理解GMP模型:Go语言运行时系统中的Goroutine、用于管理Goroutine调度的GoScheduler(P)、机器可用的逻辑处理器数量(M)。理解GPMG每个Goroutine是一个轻量级“线程”,称之为“协程”,可由Go运行时系统并发执行G与P

2023 Google 开发者大会:将大型语言模型部署到你的手机

在2022年末,不到半年时间,各家大语言模型的发展如雨后春笋,截至2023年9月,全球总共有接近100个大语言模型,可谓是百花齐放显而易见,大语言模型凭借出色的AI对话能力,已经逐渐深入各个行业2023Google开发者大会带来了AI专题,Google技术推广工程师魏巍提出“将大语言模型部署到个人终端”,关于这点,在外

[NLP] LLM---<训练中文LLama2(三)>对LLama2进行中文预料预训练

预训练预训练部分可以为两个阶段:第一阶段:冻结transformer参数,仅训练embedding,在尽量不干扰原模型的情况下适配新增的中文词向量。第二阶段:使用LoRA技术,为模型添加LoRA权重(adapter),训练embedding的同时也更新LoRA参数。第一阶段预训练由于第一阶段预训练会冻结transfor

Java基于SpringBoot的校园交友网站的设计与实现

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W+,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌文章目录一、效果演示二、前言介绍三、主要技术四、系统设计(部分)4.1、主要功能模块设计4.2、系统登录流程设计五、运行截图5.1、系统功能模块5.1.

Linux高性能服务器编程 学习笔记 第六章 高级IO函数

pipe函数用于创建一个管道,以实现进程间通信:fd参数是一个包含两个int的数组。该函数成功时返回0,并将一对打开的文件描述符填入其参数指向的数组,如果失败,则返回-1并设置errno。pipe函数创建的这两个文件描述符fd[0]和fd[1]分别构成管道的两端,往fd[1]写入的数组可以从fd[0]读出,并且fd[0

夸克扫描王识别精度领跑行业 愿携手各方伙伴探索AIGC应用新范式

日前,在“AIGC与场景化应用创新”主题研讨会上,阿里智能信息事业群夸克视觉技术负责人黄锐华分享了AI技术应用于扫描场景的最新成果。他表示,AIGC给手机扫描产品打开了创新空间,搭载大模型技术的夸克扫描王对识别手写字体、复杂公式和版式理解上的准确率达到了新高度。(夸克视觉技术负责人:黄锐华)经过几十年的发展,扫描技术已

【从入门到起飞】JavaSE—方法引用

🎊专栏【JavaSE】🍔喜欢的诗句:更喜岷山千里雪三军过后尽开颜。🎆音乐分享【Thetruththatyouleave】🥰欢迎并且感谢大家指出我的问题文章目录🍔概述🍔注意🎈如何确定是否是函数式接口🍔示例🎄方法引用的分类🏳️‍🌈引用静态方法🏳️‍🌈引用成员方法🛸注意🏳️‍🌈引用构造方法🛸

热文推荐