Linux进程之间通信

上篇文章了解到Linux平台下编译静态库和动态库并了解到链接的原理。https://www.jianshu.com/p/020b341d3c2b 这篇文章来了解一些进程方面的知识。
进程是程序运行的活动,是系统进行资源分配和调度的基本单位。简单的来看一个正在运行的程序就是一个进程。进程包含的数据有程序可运行机器码映像。映像加载到虚拟内存的 。内存的内容包括可运行代码、特定于进程的数据(输入、输出)、调用堆栈、堆栈(用于保存运行时运数中途产生的数据)。 分配给该进程的资源的操作系统描述符,如文件描述或文件句柄等。进程也类似线程存在状态的,由内核pcb进程控制块来控制进程的状态。

进程之间通信

为了安全系统设计进程之间的数据是不可以共享的,有时又需要访问另一个进程的数据。就需要进程之间的通信。
利用管道通信:
管道可以看成是一个特殊的文件,它不占磁盘空间,占用的是内存,所以我们直接可以read 和write数据。由于管道是半双工数据传输,数据只能单向流通,读写数据是不能够同时进行的。而且只限于有血缘关系(父子,兄弟进程)的进程之间的通信。
通过fork函数创建子线程看看他们是怎么通信的。

#include<stdio.h>
#include<unistd.h>

//父进程向子线程 写东西
int main() {
        int fd[2];
        int ret = pipe(fd);
        if(ret != 0) {
                printf("crate pipe fail\n");
                return -1;
        }
        pid_t pid = fork();
        if(pid < 0) {
                printf("fork process fail\n");
                return -1;
        } else if(pid == 0){
                sleep(2);
                printf("Im child process\n");
                close(fd[1]);
                char buf[11];
                read(fd[0],buf,11);
                printf("输出:%s",buf);
        }else{
                printf("Im parent process\n");
                close(fd[0]);
                write(fd[1],"hello world",11);
        }
        return 0;
}

信号:
进程之间可以通过信号来进行通信,信号是内核自带的传递携带数据量不大,一般携带一个数字作为处理的信号。在pcb进程控制块中包含有信号屏蔽字与未决信号集。信号的产生有系统调用kill , raise, abort等函数,包括硬件的异常,访问了非法内存等都会产生信号。信号的处理方式,系统可以忽略 捕获 执行系统默认活动,android应用出现异常退出系统接收到信息执行了默认的活动程序才退出的。包括进程的杀死的都是通过系统接收信号来执行的。pcb进程控制块中的信号屏蔽字是用来屏蔽某个型号的,一个型号发送是发送到pcb进程控制块中的未决信号集中的,系统执行信号时需要查看该信号是否屏蔽。
共享映射区:

共享映射区是基于文件来实现的,并不是普通的文件读写来通信的,普通的文件读写是要通过用户空间写入内核区,另一个进程读取需要从内核读取到用户的空间实现数据的通信,数据经历了两次拷贝。共享映射区通信方式只要通过一次数据的拷贝,而且还不要经过内核,用户空间进入内核是一个比较缓慢过程,不要轻易的进入内核。共享映射区的原理是通过虚拟内存映射一个文件的区域,通过操作映射的内存就能够操作文件。
共享映射区.png

看看具体的代码实现

写端
#include<stdio.h>
#include<unistd.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<string.h>
int main() {
        int fd = open("mmapipc",O_RDWR | O_CREAT | O_TRUNC, 0644);
        ftruncate(fd, 13);
        if(fd == -1) {
                printf("open fail \n");
                return -1;
        }
        char* writecontent =(char*) mmap(NULL,13,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
        if(writecontent == MAP_FAILED) {

                printf("映射失败");
                return -1;
        }
        while(1){
                sleep(1);
                memcpy(writecontent, "hello", 5);
        }

        return 0;
}
   
读端
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/mman.h>
#include <fcntl.h>

int main(){
        char *pathname = "mmapipc";
        int fd = open(pathname,O_RDONLY);
        if(fd == -1) {

                printf("open file fail\n");
                return -1;
        }

        char* readIpc =(char*)mmap(NULL,11,PROT_READ, MAP_SHARED, fd, 0);

        if(readIpc == MAP_FAILED) {
                printf("open file fail\n");
                return -1;
        }

        while (1){
                printf("%s",readIpc);
        }

        return 0;
}

小结:

Linux进程之间的通信还有套接字的方式,这里不去了解,关于进程知识,包括怎么fork子进程,什么是孤儿进程,僵尸进程,守护进程,包括虚拟内存有兴趣可以了解了解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容