Linux系统编程(三)进程间的通信

Linux系统编程(三)进程间的通信

  • 一、为什么需要进程之间的通信(IPC)?
  • 二、管道
    • 1.概念
    • 2.特质
    • 3.原理
    • 4.局限性
    • 5.代码
    • 2.读入数据
  • 三、共享存储映射
    • 注意事项
    • 父子进程通信

一、为什么需要进程之间的通信(IPC)?

当我们编码时会发现我们使用全局变量并不能在父子进程之间使用,这是为什么呢?是因为进程与进程之间是相互独立,当我们在主进程当中修改那个全局变量的时候,子进程的并不会变,因为两者用户空间的那块地址是不一样的。这时候我们引入了IPC,它是在内核创建了一个缓冲区,进程通过这个缓冲区实现进程之间的通信。

二、管道

1.概念

管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。

2.特质

1.管道的本质是一个伪文件,不占用磁盘资源
2.由两个文件描述符引用,一个表示读端,一个表示写段
3.数据从管道写段流入,读端流出

3.原理

管道内核使用环形队列机制,借助内核缓冲区(4k)实现

4.局限性

1.数据不能自己读自己写
2.数据一旦被读走,便不在管道中存在,不可重复读取
3.由于管道采用半双工通信方式。数据只能一个方向上流动
4.只能在由公共祖先的进程间使用管道

5.代码

代码如下(示例):

#include <cstdio>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>int main()
{pid_t pid;int fd[2];int ret=pipe(fd);if (ret == -1){perror("pipe error:");exit(1);}pid = fork();if(pid==-1){ perror("pipe error:");exit(1);}else if (pid == 0) //子进程{sleep(1);close(fd[1]);char buf[1024];ret=read(fd[0], buf, sizeof(buf));if (ret == 0){printf("-----------\n");}write(STDOUT_FILENO,buf,ret);}else{close(fd[0]);char* str = "hello";write(fd[1], "hello pipe\n", strlen("hello pipe\n"));wait(NULL);}return 0;
}

2.读入数据

代码如下(示例):

data = pd.read_csv('https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


三、共享存储映射

在这里插入图片描述

注意事项

1.创建映射区的过程中,隐含着一次对映射文件的读操作。
2. 当MAP_SHARED时,要求:映射区的权限应 <=文件打开的权限(出于对映射区的保护)。而MAP_PRIVATE则无所谓,因为mmap中的权限是对内存的限制。
3. 映射区的释放与文件关闭无关。只要映射建立成功,文件可以立即关闭。
4. 特别注意,当映射文件大小为0时,不能创建映射区。所以:用于映射的文件必须要有实际大小!! mmap使用时常常会出现总线错误,通常是由于共享文件存储空间大小引起的。
5. munmap传入的地址一定是mmap的返回地址。坚决杜绝指针++操作。
6. 如果文件偏移量必须为4K的整数倍
7. mmap创建映射区出错概率非常高,一定要检查返回值,确保映射区建立成功再进行后续操作。

父子进程通信


```csharp
#include <cstdio>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>int main()
{//实现父子进程之间的通信int* p;int var = 100;pid_t pid;int fd = open("temp",O_CREAT|O_RDWR,0644);if (fd < 0 ){perror("open error:");exit(1);}//unlink("temp");ftruncate(fd,4);p=(int*)mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if (p == MAP_FAILED){perror("mmap error:");exit(1);}//关闭文件close(fd);//创建子线程pid = fork();if (pid == 0){*p = 2000;var = 1000;printf("child,p = %d,var = %d\n",*p,var);}else if(pid > 0){sleep(1);printf("parent,p = %d,var = %d\n", *p, var);wait(NULL);//释放映射区int ret = munmap(p,4);if (ret == -1){perror("munmap error:");exit(1);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用mmap实现大文件的复制:单进程与多进程情况

单线程和多进程实现文件的复制&#xff08;mmap方法&#xff09; mmap实现大文件的复制单线程和多进程实现文件的复制&#xff08;mmap方法&#xff09;一、单线程实现二、多进程实现一般文件实现方法&#xff1a;1.读取&#xff08;fread&#xff09;要复制的文件2.写入&#…

exec 函数族

转自&#xff1a;http://www.cnblogs.com/mickole/p/3187409.html linux系统编程之进程&#xff08;五&#xff09;&#xff1a;exec系列函数&#xff08;execl,execlp,execle,execv,execvp)使用 本节目标&#xff1a; exec替换进程映像exec关联函数组&#xff08;execl、execl…

Linux系统编程(四)信号

Linux系统编程&#xff08;四&#xff09;信号一、什么是信号&#xff1f;1、信号的本质2、信号来源硬件来源软件来源二、常见信号1.可靠信号和不可靠信号2、不可靠信号主要有以下问题:3、可靠信号与不可靠信号注册机制三、信号处理方式四、信号处理过程五、未决信号和阻塞信号…

SIGCHLD信号回收子进程

SIGCHLD信号回收子进程代码问题注意点代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h>void handler(int signo) {int status; pid_t pid;while ((pid waitpid(0, &status…

Wait waitpid

转自&#xff1a;http://www.cnblogs.com/mickole/p/3187770.html linux系统编程之进程&#xff08;六&#xff09;&#xff1a;父进程查询子进程的退出,wait,waitpid 本节目标&#xff1a; 僵进程SIGCHLDwaitwaitpid 一&#xff0c;僵尸进程 当一个子进程先于父进程结束运行时…

Linux系统编程(五)时序竞态

时序竞态产生原因改进总结产生原因 #include <cstdio> #include <stdio.h> #include <sys/time.h> #include <unistd.h> #include <signal.h> #include <stdlib.h> #include <errno.h>void catch_sigalrm(int signo) {printf("…

Linux C++ 简单爬虫

转载&#xff1a;http://blog.csdn.net/orthocenterchocolate/article/details/38665937 方便易用&#xff0c;传入URL&#xff0c;返回对应页面的内容 [cpp] view plaincopy #include <iostream> #include <string> #include <netdb.h> #include <…

Linux系统编程(六)守护进程

Linux系统编程&#xff08;六&#xff09;守护进程一、进程组概念二、会话创建会话的条件守护进程概念守护进程模型创建守护进程一、进程组 概念 进程组&#xff0c;也称之为作业。代表一个或多个进程的集合。每个进程都属于一个进程组。 当父进程&#xff0c;创建子进程的时…

TCP 客户端和服务器端

转自&#xff1a;http://blog.csdn.net/itcastcpp/article/details/39047265 前面几篇中实现的client每次运行只能从命令行读取一个字符串发给服务器&#xff0c;再从服务器收回来&#xff0c;现在我们把它改成交互式的&#xff0c;不断从终端接受用户输入并和server交互。 [cp…

利用多线程实现linux下C语言的聊天室程序:

转载&#xff1a;http://www.360doc.com/content/16/0421/11/478627_552531090.shtml 利用多线程实现linux下C语言的聊天室程序&#xff1a; 客户端代码&#xff1a; threadsend线程负责客户端消息的发送&#xff1b; threadrecv线程负责客户端接受服务器端的消息。 [html] v…

Linux系统编程(七)消息队列

Linux系统编程&#xff08;七&#xff09;消息队列一、什么是消息队列二、消息队列内部原理三、实现消息队列的收发1.发送消息队列2.接收消息队列四、消息队列与命名管道的比较一、什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都…

基于Linux的SOCKET编程之TCP半双工Client-Server聊天程序

转自&#xff1a;http://blog.csdn.net/apollon_krj/article/details/53398448#0-tsina-1-64987-397232819ff9a47a7b7e80a40613cfe1 所谓半双工通信&#xff0c;即通信双方都可以实现接发数据&#xff0c;但是有一个限制&#xff1a;只能一方发一方收&#xff0c;之后交换收发对…

Linux系统编程(八)线程

Linux系统编程&#xff08;八&#xff09;线程一、什么是线程&#xff1f;二、Linux内核线程实现原理线程共享资源线程非共享资源线程优缺点线程控制原语一、什么是线程&#xff1f; LWP&#xff1a;light weight process 轻量级的进程&#xff0c;本质仍是进程(在Linux环境下…

智能算法(GA、DBO等)求解阻塞流水车间调度问题(BFSP)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

Linux socket编程,对套接字进行封装

转自&#xff1a;http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html 下面是对socket操作的封装&#xff0c;因为在Linux下写中文到了windows里面会乱码&#xff0c;所以注释用英文来写&#xff0c;有空再查下解决方法吧 socket.h #ifndef SOCKET_H #define SOCKET_…

Linux系统编程(九)线程同步

Linux系统编程&#xff08;九&#xff09;线程同步一、什么是线程同步&#xff1f;二、互斥量三、条件变量pthread_cond_wait函数pthread_cond_signal函数生产者和消费者模型一、什么是线程同步&#xff1f; 线程同步&#xff0c;指一个线程发出某一功能调用时&#xff0c;在没…

linux网络编程(一)网络基础传输知识

linux网络编程&#xff08;一&#xff09;网络传输基础知识一、什么是协议&#xff1f;二、使用步骤典型协议2.网络应用程序设计模式C/S模式B/S模式优缺点3.分层模型4.TCP/IP四层模型通信过程5.协议格式数据包封装以太网帧格式ARP数据报格式IP段格式UDP数据报格式TCP数据报格式…

linux网络编程:使用多进程实现socket同时收发数据

转载&#xff1a;http://blog.csdn.net/li_wen01/article/details/52685844 前面已讲过使用一个进程实现服务端和客户端P2P通信的实例&#xff0c;但是它只能同时处理一个客户端的连接。如果要实现并发处理多个客户端的连接并且实现P2P通信&#xff0c;可以使用多进程来处理。相…

Linux 进程学习(四)------ sigaction 函数

转自&#xff1a;http://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html 使用 sigaction 函数&#xff1a; signal 函数的使用方法简单&#xff0c;但并不属于 POSIX 标准&#xff0c;在各类 UNIX 平台上的实现不尽相同&#xff0c;因此其用途受 到了一定的限制…

linux网络编程(二)高并发服务器

linux网络编程&#xff08;二&#xff09;高并发服务器错误处理高并发服务器多进程并发服务器客户端错误处理 #include "wrap.h"int Bind(int fd, const struct sockaddr* sa, socklen_t salen) {int ret;if ((ret bind(fd, sa, salen)) < 0){perror("bind…