首页 > 系统相关 >进程间通信

进程间通信

时间:2023-04-28 15:57:17浏览次数:33  
标签:pipe int pipefd 间通信 flag str 进程 include

匿名管道

/*
    匿名管道
        用在具有关系的进程间,原因是共享文件描述符
        环形队列,双指针-读指针、写指针
        管道中没有数据,read将会被堵塞
        管道写满时,write将会被堵塞
    
    创建匿名管道
        #include <unistd.h>
            

        int pipe(int pipefd[2]);
            参数:
                pipefd[2]:两个文件描述符,传出参数
                    pipefd[0]:指向读端
                    pipefd[1]:指向写端
            返回值:
                成功:返回0
                失败:-1

        在命令行中可以在两个命令之间使用 |,如ls | wc -l

    查看管道缓冲区大小命令
        ulimit -a
    查看管道缓冲区大小函数
        #include <unistd.h>

        long fpathconf(int fd, int name);
            参数:
                name:_PC_PIPE_BUF      宏值,可查文档看到
    注意事项:         1、所有写描述符都关闭了,当所有数据都被读取后,如果进行读,返回0         2、如果存在写描述符没有关闭,当所有数据都被读取后,如果进行读,则阻塞         3、如果读描述符都关闭了,如果有进程进行写操作,则该进程会收到SIGPIPE信号,异常终止         4、如果存在读描述符没有关闭,管道写满时,再写会堵塞,直到有空位置
*/



// 子进程向父进程传输数据
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{

    int pipefd[2];
    int pipe_flag = pipe(pipefd);
    if(pipe_flag == -1)
    {
        perror("pipe error");
        return -1;
    }



    int fork_flag = fork();

    if(fork_flag == 0)
    {
        char str[1024];
        strcpy(str, "I am a Chinese");
        printf("In the child process: %s\n", str);
        write(pipefd[1], str, strlen(str));
    }
    else
    {
        char str[1024];
        read(pipefd[0], str, sizeof(str));
        printf("In the parent process: %s\n", str);
    }





    return 0;
}

 

ps aux -> grep root 示例

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

// ps aux | grep xxx

int main()
{
    int pipefd[2];

    int pipe_flag = pipe(pipefd);
    if(pipe_flag == -1)
    {
        perror("pipe error");
        return -1;
    }

    int fork_flag = fork();
    if(fork_flag == -1)
    {
        perror("fork error");
        exit(-1);
    }
    else if(fork_flag == 0)
    {
        close(pipefd[0]);
        dup2(pipefd[1], STDOUT_FILENO);
        execl("/bin/ps", "ps", "aux", NULL);
    }
    else
    {
        close(pipefd[1]);
        dup2(pipefd[0], STDIN_FILENO);
        execl("/bin/grep", "grep", "root", NULL);
    }


    return 0;

}

 

非堵塞示例

// 非阻塞管道示例
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
int main()
{

    int pipefd[2];
    int pipe_flag = pipe(pipefd);
    if(pipe_flag == -1)
    {
        perror("pipe error");
        return -1;
    }



    int fork_flag = fork();

    if(fork_flag == 0)
    {
        close(pipefd[0]);
        char str[1024];
        strcpy(str, "I am a Chinese");
        while(1)
        {
            // printf("In the child process: %s\n", str);
            write(pipefd[1], str, strlen(str));
            sleep(10);
        }
    }
    else
    {
        
        int fd_flag = fcntl(pipefd[0], F_GETFD); // 获取文件flag
        fd_flag |= O_NONBLOCK;  // 追加不堵塞
        fcntl(pipefd[0], F_SETFL, fd_flag);   // 设置新的flag


        close(pipefd[1]);
        
        while(1)
        {
            char str[1024];
            int len = read(pipefd[0], str, sizeof(str)); 
            printf("%d\n", len);
            if(len <= 0)  // 不要用str的长度进行判断,通过返回值判断
                printf("no info\n");
            else
                printf("parent process recv info: %s\n", str);
            sleep(1);
        }
    }


    return 0;
}

 

标签:pipe,int,pipefd,间通信,flag,str,进程,include
From: https://www.cnblogs.com/WTSRUVF/p/17361694.html

相关文章

  • Python3多进程共享变量实现方法
    今天同事反映一个问题让帮忙看一下:多进程共用一个变量,在一个进程中修改后,在另外的进程中并没有产生修改。 一、错误的实现方式最初以为是没添加global声明导致修改未生效,但实际操作发现global方式在多进程中也只能读不能写。错误示例代码如下:importmultiprocessing#声......
  • 端口进程查看相关linux命令
    硬盘使用情况df-lh查看内存占用free-mhcat/proc/meminfoMem:内存的使用信息Swap:交换空间的使用信息total:总计物理内存的大小。used:已使用物理内存。free:可用物理内存。shared:多个进程共享的内存总额。buffers/cached:缓存缓冲使用物理内存大小。availabl......
  • 进程与线程
    进程和线程都是操作系统中的概念,它们是操作系统调度和管理计算机资源的基本单位。进程(Process)是指正在运行中的程序,它是系统资源分配和调度的基本单位。一个进程可以包含多个线程,每个线程都运行在同一个进程的上下文中,共享该进程的内存空间、文件等系统资源。操作系统通过进程间......
  • 进程和线程
    多线程的内容很重要;为了面试,时间不充裕就背,学习最重要没必要求大求全,把握核心和重点就OK;效率最高时间充裕除了背,需要慢慢自己做实现去理解;从大厂的一则招聘谈起:Java基础扎实,熟悉JVM、多线程、集合等基础,熟悉分布式、缓存、消息、搜索等机制三年以上Java开发经验,熟悉Spring......
  • windows系统处理占用端口号的进程
    遇到占端口被占用,一般通过如下命令处理netstat-ano|findstr端口号杀掉占用端口号的进程taskkill/f/t/im进程号  ......
  • 调度器51—进程优先级 prio、static_prio、normal_prio、rt_priority
    一、概述structtask_struct{intprio;intstatic_prio;intnormal_prio;unsignedintrt_priority;...} 二、动态优先级——prioprio表示进程的当前优先级,是一个动态值,会在进程运行时不断变......
  • 进程
    进程、轻量级进程和线程进程在教科书中通常定义:进程是程序执行时的一个实例,可以把它看作充分描述程序已经执行到何种程度的数据结构的汇集。从内核的观点,进程的目的就是担当分配系统资源(CPU时间、内存等)的实体。 当一个进程被创建时,他几乎于父进程相同。它接受父进程地址空间......
  • jenkins 杀掉衍生进程解决办法。BUILD_ID=DontKillMe
    jenkins杀掉衍生进程解决办法1.使用的场景在构建任务的同时,需要启动程序在构建任务运行的时候,exe程序正常运行,而构建任务完成后exe程序也同时关闭掉。 2.如果要解决构建任务后,exe程序还继续运行。需要在,设置的全局属性,添加BUILD_ID=DontKillMe后,再次构建的时候,就可以解......
  • Linux内核分析:深入理解进程切换
      我们知道进程切换就是变更进程上下文,而实现上下文切换的函数就是context_switch函数,该函数为kernel/sched/core.c文件中,代码如下:/**context_switch-switchtothenewMMandthenewthread'sregisterstate.*/static__always_inlinestructrq*context_swit......
  • 什么是文件传输,介绍文件传输的发展进程
    什么是文件传输,介绍文件传输的发展进程首先,我们先来认识一下文件传输的定义,了解文件传输的概念,才能够真正了解文件传输软件的发展历程。文件传输(filetransfer),是指将一个文件或其中的一部分从一个计算机系统传到另一个计算机系统。它可能把文件传输至另一计算机中去存储,或访问......