利用命名管道实现任意进程间的通信

简介: 利用命名管道实现任意进程间的通信

我们知道每个进程都有自己的虚拟地址空间,其中包括了用户空间和内核空间,用户空间是进程可以访问的地址空间,内核空间就是操作系统内核独享的部分,所以任意进程共享内核空间。

此时,我们就可以借助内核开辟一块内存用于进程间的通信。

创建文件是mkdir filename  创建命名管道也是类似的 mkfifo filename

当然也可以用一个函数

#include <sys/types.h>
#include <sys/stat.h>
 
int mkfifo(const char *pathname, mode_t mode);
  • pathname:命名管道的路径名。
  • mode:指定创建的管道的访问权限,类似于 chmod 函数中的权限设置。
返回值:
  • 若成功,返回0。
  • 若失败,返回-1,并设置 errno 错误码以指示错误类型
实操部分

一个fifo_w.c   用于写端

一个fifo_r.c     用于读端

几个问题  1.一个读一个写肯定没问题,一个写多个读呢?

                2.一个读多个写呢?多个读多个写呢?

先给出实验结果,代码放下面

如下图,一个读,两个写,其实他读的顺序是不能保证两个线程写入的时机冲突问题

一个写,多个读

mmap实现方式:内存映射实现进程通信-CSDN博客

fifo_w.c

#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void sys_err(char *str){
        perror(str);
        exit( -1);
}
int main(int argc,char *argv[]){
        int fd,i;
        char buf[ 4096];
        if (argc < 2) {
        printf( "Enter like this: ./a.out fifonane\n");
        return -1;
        }
        fd = open(argv[1],O_WRONLY);
        if(fd< 0)
                sys_err( "open" );
        i=0;
        while(1){
        sprintf(buf,"hello pku %d\n",i++);
        write(fd,buf,strlen(buf));
        sleep(1);
        }
        close(fd);
        return 0;
}

fifo_r.c:

#include <sys/stat.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
void sys_err(char *str){
        perror(str);
        exit( -1);
}
int main(int argc,char *argv[]){
        int fd,len;
        char buf[4096];
        if (argc < 2) {
        printf( "./a.out fifonane\n");
        return -1;
        }
        fd = open(argv[1],O_RDONLY);
        if(fd< 0)
                sys_err( "open" );
        while(1){
                len=read(fd,buf,sizeof(buf));
                write(STDOUT_FILENO,buf,len);
                sleep(1);
        }
        close(fd);
        return 0;
}
相关文章
|
6天前
|
消息中间件 负载均衡 Linux
【linux】匿名管道|进程池
【linux】匿名管道|进程池
6 0
|
26天前
|
存储 安全 Python
进程通信 , 信号量 , 队列 , 管道 , 共享内存
进程通信 , 信号量 , 队列 , 管道 , 共享内存
|
2月前
|
消息中间件 Linux C语言
进程通信:管道与队列
进程通信:管道与队列
|
2月前
|
存储 安全 调度
【操作系统】进程控制与进程通信
【操作系统】进程控制与进程通信
29 3
|
1天前
|
缓存 Linux 调度
【linux】进程控制——进程创建,进程退出,进程等待
【linux】进程控制——进程创建,进程退出,进程等待
|
4天前
|
Web App开发 运维 监控
深入探索Linux命令pwdx:揭秘进程工作目录的秘密
`pwdx`命令在Linux中用于显示指定进程的工作目录,基于`/proc`文件系统获取实时信息。简单易用,如`pwdx 1234`显示PID为1234的进程目录。结合`ps`和`pgrep`等命令可扩展使用,如查看所有进程或特定进程(如Firefox)的目录。使用时注意权限、进程ID的有效性和与其他命令的配合。查阅`man pwdx`获取更多帮助。
|
4天前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
|
5天前
|
监控 Linux
深入了解Linux的pmap命令:进程内存映射的利器
`pmap`是Linux下分析进程内存映射的工具,显示内存区域、权限、大小等信息。通过`/proc/[pid]/maps`获取数据,特点包括详细、实时和灵活。参数如`-x`显示扩展信息,`-d`显示设备。示例:`pmap -x 1234`查看进程1234的映射。注意权限、实时性和准确性。结合其他工具定期监控,排查内存问题。
|
5天前
|
监控 网络协议 关系型数据库
如何在Linux中查看正在运行的进程以及过滤特定端口和进程名称
如何在Linux中查看正在运行的进程以及过滤特定端口和进程名称
9 0