进程间通信——文件

1、信号的局限性

进程虽然高度独立和封闭,但进程依然有通信的需要。

信号——中断,信号能够实现一定程度的进程间通信,但它是高度抽象,所表达的含义是告诉某一个进程什么事情发生了。信号却不能够传递复杂的、有效的、具体的数据,这就是信号的局限性。

就需要其他的手段来构建进程间复杂数据的传递。

2、基于文件的进程间通信

早期的系统中,为了能够让进程之间方便的共享数据,最容易想到的解决方案就是,使用磁盘上的文件系统(因为文件系统对于所有进程都是公开且共享的)。

进行文件间通信代码:

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

int main(void){
    pid_t pid;
    int fd; 
    char buf[80];

    pid = fork();
    if(pid == 0){ 
        fd = open("./tmp", O_CREAT | O_WRONLY, 0755);
        if(fd < 0){ 
            perror("");
            exit(-1);
        }   
        sprintf(buf, "I am child, This msg is pid=%d\n", getpid());
        write(fd, buf, strlen(buf));
        close(fd);
        sleep(5);
    }else if(pid > 0){ 
        sleep(1);
        fd = open("./tmp", O_APPEND | O_RDONLY);
        if(fd < 0){ 
            perror("");
            exit(-1);
        }
        read(fd, buf, sizeof(buf));
        printf("I am father, I have recv a msg : [%s]\n", buf);
        close(fd);
    }else{
        perror("");
    }

    return 0;
}

运行结果

3、文件间的往来通信

为了能够实现两个进程通过文件进行有序的数据交流,还得借助于信号的处理机制。

  (1)、通过pause()等待对方发起一个信号,已确认可以开始执行下一次读/写操作;

  (2)、通过kill()方法向对方发出明确的信号:可以开始下一步执行(读、写);

文件通信,代码如下:

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

void catch_SIGUSR1(int sig){}

int main(void){
    pid_t pid;
    int fd; 
    char buf[80];
    int i;

    signal(SIGUSR1, catch_SIGUSR1);
    pid = fork();
    if(pid == 0){ 
        fd = open("./tmp", O_CREAT | O_WRONLY, 0755);
        if(fd < 0){ 
            perror("");
            exit(-1);
        }
        for(i = 0; i < 5; i++){
            sprintf(buf, "I am child, This msg is pid=%d i=%d\n", getpid(), i);
            write(fd, buf, strlen(buf));
            sleep(1);   //速度太快,写完的休眠1秒,有时间让父进程读取数据。
            kill(getppid(),SIGUSR1);
            pause();
        }
        close(fd);
        sleep(5);
    }else if(pid > 0){
        pause();
        fd = open("./tmp", O_APPEND | O_RDONLY);
        if(fd < 0){
            perror("");
            exit(-1);
        }
        for(i = 0; i < 5; i++){
            read(fd, buf, sizeof(buf));
            printf("I am father, I have recv a msg : [%s]\n", buf);
            sleep(1);   //速度太快,读完的休眠1秒,有时间让子进程写入数据。
            kill(pid, SIGUSR1);    
            pause();
        }
        close(fd);
    }else{
        perror("");
    }

    return 0;
}

运行结果

这样就利用文件达到了父子进程之间的通信了。

由以上的代码可以看出:直接通过文件的方式进行的进程间的通信的编程控制是非常复杂的,就需要一种更加简洁的处理方案。

时间: 2024-10-15 02:38:02

进程间通信——文件的相关文章

进程间通信--文件映射方式

1. 文件映射(Memory-Mapped Files)  内存映射文件允许应用程序把文件映射到一个进程的虚拟地址空间,这样文件内的数据就可以用内存读写指令来访问. 通过内存文件映射,应用程序不必执行文件I/O操作也无需对文件内容进行缓冲处理.内存文件映射的这种特性是非常适合于用来管理大尺寸文件的. 2. 共享内存(Shared Memory)  Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况.进程在创建文件映射对象时用INVALID_HANDLE_VA

centos笔记之文件或目录属性信息

第一版块共11列:第一列:表示文件类型:如:减号'-':普通文件或者可执行命令d:代表目录c:表示字符设备(处理字符的设备,如显示器鼠标)b:块设备(如磁盘.U盘等存文件的)l:软链接文件s:进程间通信文件,只用于本地p:管道文件(用于通信,把某些命令的输出作为其他命令的输入)第2~9列:表示权限 (r可读,w可写,x可执行)2~4三列:表示所属组权限5~7三列:表示所属主权限8~10三列:表示所有者权限第13列:表示高低位,了解即可 第二板块数字列:表示与该文件有具有相同inode 文件或目录

linux初学之基本命令学习

mkdir 作用:创建目录 语法:mkdir filename 参数:-p 级联创建目录 PS:同一目录下mkdir与touch的文件不可重名,因为在linux下的目录文件和普通文件都视为文件. rmdir 作用:删除目录 语法:rmdir filename 参数:-p 级联删除目录 rm 作用:删除文件 语法:rm filename 参数: -r 删除目录 参数:-f 强制删除,不显示删除询问 PS:rm -rf a/b/c 与 rmdir -p a/b/c 效果上相同. cp 作用:复制文件

Windows API 学习指南

1.WindowsAPI开发入门2.Windows数据类型3.Windows数据类型与WindowsAPI函数4.Windows数据结构5.将系统目录信息写入文件6.窗口创建以及消息处理7.使用对话框资源创建窗口8.使用MFC创建对话框窗口9.宽字符10.三种版本11.字符转换12.遍历卷13.驱动器属性14.磁盘容量15.文件操作的四种方法16.文件操作(一)17.文件操作(二)18.目录操作(一)19.目录操作(二)20.目录操作(三)21.文件属性和时间22.内存映射文件23.系统信息(一

分布式技术一周技术动态 2016.08.07

searcher 分布式纵向方向主要涵盖的范围包括分布式系统理论和设计实践, 资源管理和虚拟化技术, 大规模服务稳定性技术, DevOps和自动运维技术等方面, “分布式方向一周技术动态"是我每周总结和整理的关于分布式方向的精选技术文章, 希望以此让大家能够跟踪业界相关的技术动态, 培养大家对分布式系统的兴趣, 学习分布式系统理论和设计思路, 辅助大家的日常工作. 每周的技术动态会在hi群和邮件组里同步发布, 欢迎大家阅读. 对于后续 分布式技术动态 有任何意见或者建议, 大家可以随时联系我.

python进程、多进程

进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体.. 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed). 广义定义:进程是一个具有一定独立功能的

最佳vim技巧

最佳vim技巧----------------------------------------# 信息来源----------------------------------------www.vim.org         : 官方站点comp.editors        : 新闻组http://www.newriders.com/books/opl/ebooks/0735710015.html : Vim书籍http://vimdoc.sourceforge.net/cgi-bin/vim

Java NIO 应用 -- 使用内存映射文件实现进程间通信

一看到 Java NIO 的内存映射文件(MappedByteBuffer),让我立即就联想到 Windows 系统的内存映射文件.Windows 系统的内存映射文件能用来在多个进程间共享数据,即进程间的共享内存,是通过把同一块内存区域映射到不同进程的地址空间中,从而达到共享内存. Java NIO 的内存映射文件和 Windows 系统下的一样,都能把物理文件的内容映射到内存中,那么 MappedByteBuffer 是否能用来在不同 Java 进程(JVM) 间共享数据呢?答案是肯定的,这样

进程间通信--两个进程操作同一个文件

a.txt文件内容如下: hello,world. 编写两个不同的可执行程序,名称分别为a和b.在a程序中调用open函数打开a.txt文件,在b程序不可调用open或者fopen.只允许调用read函数来实现读取a.txt文件(a程序中可以使用fork和execv函数创建子进程). makefile .SUFFIXES: .c .o CC=gcc SRCS=a.c OBJS=$(SRCS:.c=.o) EXEC=a all: $(OBJS) $(CC) -o $(EXEC) $(OBJS) @