linux进程通信发送方式,Linux服务器编程——Linux系统编程之进程通信

进程通信又称IPC

IPC方法

方法:管道(最简单)

信号(开销最小)

共享映射区/共享内存(无血缘关系)

本地套接字(最稳定)

Linux文件类型: -   文件

d  目录

l   符号链接

s   套接字        伪文件

b    块设备       伪文件

c字符设备       伪文件

p管道               伪文件

管道

其本质是:

1、伪文件,实质为内核缓冲区

2、由两个文件描述符表示,一个表示读端,一个表示写端

3、数据从读端流入,从写端流出

管道原理:内核使用环形队列机制,借助内和缓冲区实现

管道局限性:1、数据自己读不能自己写

2、数据一旦被读走,便在管道中不存在,不可反复读取

3、由于管道采用半双工通信方式,数据只能在一个方向上流动

4、只有公共祖先的进程间才能使用管道

匿名管道

适用于:只有公共祖先的进程

pipe函数

作用:创建管道

头文件

函数模型

#include int pipe(int pipefd[2])

pipefd[2]:传出参数

读端、写端由自己决定

返回值:0 成功

非0 错误代码

管道读写规则:

读管道:当管道中有数据,read返回实际读到的字节数

当管道中没有数据,若写端全关闭,read函数返回0

若任有写端打开,阻塞等待

写管道:当读端全关闭时,进程异常终止(SIGPIPE信号)

有读端打开,若管道未满,写数据,返回写入字节数

若管道已满,阻塞(少见)

获取管道缓冲区大小:命令 ulimit -a

fpathconf函数

作用:获取管道缓冲区大小

头文件

#include 函数原型

long int fpathconf(int fd,int parameter)

paramter:__PC_PIPE_BUF

#define _GNU_SOURCE

#include #include int pipe2(int pipefd[2], int flags)

优点:实现手段简单

缺点:单向通信,只有血缘关系进程间使用

有名管道

命名管道是一种特殊类型的文件。

命名管道和匿名管道区别:

管道应用的一个限制就是只能在具有亲缘关系的进程间通信,命名管道可以再不相关的进程间交换数据。

mkfifo函数

作用:创建一个FIFO文件

头文件

#include 函数原型

int mkfifo(const char *filename, mode_t mode)

mode:权限

返回值:成功 0

-1 失败

可多读端,多写端

共享内存

命名映射区

mmap函数

作用:

头文件:

#include 函数原型

void* mmap(void *addr, int length , int port , int flag, int fd, off_t offset)

参数:

addr:建立的映射区的首地址,由Linux内核指定,直接传NULL

length:创建映射区的大小

port:映射区的权限

PORT_READ

PROT_WRITE

PROT_READ| PROT_WRITE

flags:标志为参数(常用于设定更新物理区域,设置共享,创建匿名映射区)

MAP_SHARED:会将内存所做的修改反映到硬盘

MAP_PRIVATE

fd:文件描述符

offset:映射文件的便宜为4K倍数

返回值:成功 返回映射区首地址

失败 MAP_FAILD 宏

munmap函数

头文件

#include 函数原型

int munmap(void* addr, size_t length)

使用注意事项:

1、创建映射区过程中,隐含一次对文件的读操作

2、当MAP_SHARED,要求映射区的权限<= 文件打开权限。而MAP_PRIVATE则无所谓,因为mmap中的权限是对内存的限制

3、映射区的释放与文件关闭无关,只要映射建立成功,文件可以立即关闭。

4、当映射文件大小为0时,不能创建映射区。

5、munmap传入的地址一定是mmap的返回地址。坚决抵制自增操作

6、文件偏移量必须是4096的倍数

7、mmap创建映射区出错率非常高,一定要检查返回值,确保映射区建立成功后在操作

匿名映射区

映射区的缺陷是,每次都创建映射区时一定要依赖一个文件才能实现,通常要open,unlink,close等比较麻烦,因此可以利用匿名映射来代替。

int *p = mmap(NULL, 4, PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0)

mmap无血缘关系进程间通信

信号

基本的属性

1、简单

2、不能携带大量信息

3、满足某个特定条件才发送

与信号相关的事件和状态

产生信号:

按键产生

系统调用   kill    raise   abort

软件条件    定时器  alarm

命令条件   kill命令

递答:递送且到达

未决:产生和递答之间状态

信号处理方式:

1、执行默认动作

2、忽略(丢弃)

3、捕捉(由用户处理函数)

信号4要素

1、编号      2、名称      3、时间        4、默认处理动作

查看man 7 signal可以查看帮助

产生信号函数

kill函数/命令

kill命令:kill -SIGKILL pid

头文件

#include #include 函数原型

int kill(pid_t pid, int sig)

参数:

pid:>0 发送信号给指定进程

=0 发送信号给 调用kill函数进程属于同一进程组的所有进程

<0 取pid的绝对值发给对应进程

=-1 发给进程 有权限发送的系统中所有进程

raise函数

作用:给当前进程发送信号

头文件

#include #include 函数模型

int raise(int sig)

abort函数

作用:给当前进程发送 异常终止信号 SIGABRT

头文件

#include #include

函数原型

int abort(void)

软件条件产生信号

alarm函数

每个进程有且只有唯一一个定时器

头文件:

#include 函数原型

unsigned int alarm(unsigned int seconds)

返回值:

返回0或剩余的秒数,通常alarm(0)返回闹钟剩余秒数,无失败,支持秒级,与进程状态无关

setitimer函数

作用:设置定时器,精度us级

头文件

#include 函数原型

int getitimer(int which, struct itimerval *curr_value)

int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value)

参数:

which:制定定时方式

自然定时 ITIMER_REAL SIGALRM 计算自然时间

虚拟空间计时(用户空间) ITIMER_VIRTUAL SIGVTALRM 只计算进程占用CPU时间

运行时间计时(用户+内核) ITIMER_PROF ITIMER_PROF 计算占用CPU及执行系统调用的时间

struct itimerval{

struct timeval it_interval; //下一次定时 ,,两次任务间隔

struct timeval it_value; //当前定时值,用来定时时长

};

struct timeval{

time_t tv_sec; //秒数

suseconds_t tv_usec; //微秒数

};

信号集操作函数

信号集设定

sigset_t set; //无符号长整形 typedef unsigned long sigset_t

int sigemptyset(sigset_t *set); 将某个信号请0

int sigfillset(sigset_t *set) 将某个信号集置1

int sigaddset(sigset* set, int signum) 将某个信号加入信号集

int sigdelset(sigset* set, int signum) 将某个信号清除信号集

int sigismember(const sigset_t* set, int signum) 判断某个信号在信号集中

sigprocmask函数

作用:屏蔽信号,解除信号,本质读取或修改进程的信号屏蔽字,严格注意:屏蔽信号:只是将信号处理延后执行,而忽略表示将信号丢弃

头文件

函数原型

int sigprocmask(int how, const sigset_t * set, sigset_t *oldset)

参数;set 传入参数,位图,1表示屏蔽

oldset  传出参数 用来保存旧的信号屏蔽集

how:假设当前信号屏蔽字mask

SIG_BLOCK,set表示需要屏蔽的信号

SIG_BLOCK,set表示需要解除的屏蔽信号

SIG_SETMASK,代替原始屏蔽的新的屏蔽

sigpending函数

作用:读取当前进程的未决信号集

函数原型

int sigpending(sigset_t *set)

参数:set 传出参数

信号捕捉

signal函数

头文件

#include 函数原型

typedef void (*sighandler_t)(int)

sighandler_t signal(int signum, sighandler_t handler)

返回值:SIG_ERR 错误

sigaction函数

头文件

#include 函数原型

int sigaction(int signum, const struct sigaction * act, struct sigaction *oldact)

作用:修改信号处理动作

参数

struct sigaction{

void (*sa_handler)(int) //函数名

void (*sa_sigaction)(int, siginfo_t *, void *) //当sg_flags被指定为SA_SIGINFO时,使用该型号处理程序(很少使用)

sigset_t sa_mask //用于 处理函数在被调用时屏蔽生效

int sa_flags //0表示默认属性

void (*sa_restorer)(void) //废弃,已不用

};

信号捕捉特性

1、阻塞的信号不支持排队,产生多次,只记录一次。

竞态条件

pause函数

作用:调用该函数可以使进程主动挂起,等待信号唤醒

头文件

#include 函数原型

int pause(void)

返回值:

1、如果信号的默认处理动作是终止进程,则进程终止,pause函数没有机会返回

2、如果信号的默认处理是忽略,进程继续挂起,pause函数不返回

3、如果信号的处理动作是捕捉,则调用完信号处理函数之后,pause函数返回-1

4、pause收到的信号不能被屏蔽,如果被屏蔽就不能唤醒

信号传参

发送信号传参

sigqueue函数对应kill函数,但可想指定进程发送信号的同时携带参数。

sigqueue函数

头文件

函数原型

int sigqueue(pid_t pid, int sig, cinst union sigval value);

union sigval{

int sigval_int;

void *sival_ptr;

};

捕捉函数传参

sigaction函数

见信号捕捉函数

当注册信号捕捉函数,不适用sa_handler 而使用 sa_sigaction.

进程组

进程组操作函数

getpgrp函数

获得当前进程组ID

pid_t getpgrp(void)

getpgid函数

获取指定进程的进程组ID

pid_t getpgid(pid_t pid)

setpgid函数

改变进程默认的所属进程组,通常加入一个现有进程组或创建型进程组

int setpgid(pid_t pid, pid_t pgid)

会话

创建会话

创建会话有6点:

1、调用进程不能是进程组租场,新进程变为会长

2、该进程变为新进程组组长

3、需要root权限(Ubuntu不需要)

4、新会话丢弃原有控制终端,该回话没有控制终端

5、该调用进程是组长进程

6、建立会话时,先调用fork,父进程种子,子进程调用setpgid

getsid函数

获得进程的会话ID

pid_t getsid(pid_t pid)

srtsid函数

int setsid()

守护进程

守护进程/精灵进程:Linux后台服务进程,无终端,周期性执行某种任务或等待处理某些发生的条件。

创建守护进程,最关键的是调用setsid函数创建一个新的session,并且成为session leader

创建守护者模型

1、创建子进程,父进程退出,所有工作都脱离了控制终端

2、在子进程中创建新的会话

setsid函数

3、改变当前目录为根目录   chdir函数

防止占用可卸载的文件系统,也可以换成其他路径

4、重设文件权限掩码

umask函数

防止继承的文件创建屏蔽字拒绝某些权限,增加灵活性

5、关闭文件描述符

继承的打开文件不会用到,浪费资源,不关闭 0,1,2   而是重定向  >  /dev/null                      dup2()

6、开始执行守护进程核心

7、守护进程退出处理

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

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

相关文章

EMOS 如何停止反病毒和防垃圾邮件功能

1、修改main.cf配置文件&#xff0c;红色部分为需要注释的部分vim /etc/postfix/main.cf# smtpd related configsmtpd_recipient_restrictions permit_mynetworks,permit_sasl_authenticated,reject_non_fqdn_hostname,reject_non_fqdn_sender,reject_non_fqdn_recipient,rejec…

图论部分简单总结

总的感受: 这里大概囊括了一下图论的基础知识&#xff0c;图论是一个比较考验思维的部分。 尤其是后面有关二分图,网络流等的分支,对建模转化的要求还是很高的。 进入正题了&#xff1a; 一、最短路&#xff1a; 这一个部分不想多讲&#xff0c;虽然是很基础的一个部分&#xf…

Oracle学习笔记:数据字典

oracle数据字典 说起字典&#xff0c;下面让我来打个比方。我们读书写字&#xff0c;靠的是什么&#xff1f;你会说&#xff1a;字&#xff01;那我问你&#xff0c;你所用的字又是什么呢&#xff1f;&#xff01;这时&#xff0c;你只可能把字典&#xff08;新华字典、康熙字典…

linux分区转换gpt命令,Linux中磁盘如何转换GPT格式

Fdisk命令虽然很交互&#xff0c;操作也方便&#xff0c;但是对于大于2T的磁盘无法操作&#xff0c;假如我们想用大于2T的磁盘怎么办?可以把磁盘转化为GPT格式。GPT格式的磁盘相当于原来MBR磁盘中原来保留4个partition table的416个字节只留第一个16个字节&#xff0c;类似于扩…

JAVA格式化当前日期或者取年月日

Date d new Date(); System.out.println(d); SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateNowStr sdf.format(d); System.out.println("格式化后的日期&#xff1a;" dateNowStr); 转载于:https://www.cnblo…

DHL出台货运新方案

DHL出台货运新方案(来自&#xff1a;北京国际快递) 这是中国货运行业内首次由货运公司发起的关于货运安全方面的战略合作项目&#xff0c;货运公司与机场货运站、航空公司首次共同协作致力于货物的安全保障。 国际快递巨头DHL日前宣布&#xff0c;旗下的货运部门DHL全球货运物流…

linux 帐户安全管理员权限,Linux - 安全 - 账户管理

Linux 账户管理用户用户文件 /etc/passwd该文件所有用户可读&#xff0c;每一行代表一个用户&#xff0c;包含7个字段&#xff0c;分别用:隔开。# 查看文件内容cat /etc/passwd;内容&#xff1a;root:x:0:0:root:/root:/bin/bashwuhd:x:1002:1002::/home/wuhd:/bin/bash说明&am…

【转】sql表及字段命名规范

1.数据库表命名规范: (1)表名前应该加上前缀&#xff0c;表的前缀一个用系统或模块的英文名称缩写&#xff0c;前缀全部大写或首字母大写&#xff0c;表名中包含的单词首字母大写。 (2)数据库表名应该有意义&#xff0c;并且易于理解&#xff0c;最好使用可以表达功能的英文单词…

“卧槽”是怎么回事

“卧槽”是怎么回事2009-02-23 10版&#xff1a;新论 主持人&#xff1a;百科小子 提问者&#xff1a;丁莹&#xff08;上海南京西路&#xff09; 解答者&#xff1a;段凡&#xff08;华东理工大学社会与公共管理学院博士&#xff09; 问&#xff1a;日前有一项调查显示&am…

ubuntu查看硬件信息

ubuntu查看硬件信息 1,外部探针probe sudo apt-get install hwinfo 执行hwinfo获取系统信息 --short 2,系统命令dmidecode(硬件信息) or dmesg(主要是开机信息) 基于命令ubuntu 系统硬件信息查看 主板信息,序列号,产品名 dmesg | grep -i cpu dmidecode -t processor 硬盘(分区…

linux win10虚拟内存,高手解惑win10系统电脑虚拟内存不足的还原技巧

我们在使用电脑的时候&#xff0c;难免会遇到win10系统电脑虚拟内存不足的情况&#xff0c;根据小编的调查并不是所有的朋友都知道win10系统电脑虚拟内存不足的问题怎么解决&#xff0c;针对win10系统电脑虚拟内存不足的问题&#xff0c;我给大家整理总结了详细的解决步骤&…

第三章总结

第三章总结 栈与队列都是特殊的限制型的线性表&#xff0c;通常没有查询这个操作 栈的特点就是先进后出&#xff0c;只可以在栈顶进行插入删除&#xff0c;顺序栈定义指向栈顶与栈底的指针&#xff08;方便判断栈的情况&#xff09;也可以只定义一个栈顶指针top然后通过top-1来…

USB的八个问题和答案(转)

http://www.amobbs.com/thread-901041-1-1.html 问题一&#xff1a;USB的传输线结构是如何的呢&#xff1f; 答案一&#xff1a;一条USB的传输线分别由地线、电源线、D、D-四条线构成&#xff0c;D和D-是差分输入线&#xff0c;它使用的是3.3V的电压&#xff08;注意哦&#xf…

linux python3运行,将Python3安装到Linux上并运行

将Python3安装到Linux上并运行使用win10开发一个很好的python项目并把它部署到Linux中&#xff0c;有一个问题需要解决&#xff1a;如何在Linux中运行py文件&#xff1f;以LunixCentOS7.x平台为例&#xff0c;CentOS系统已经有了python2.x的自带版本&#xff0c;可以通过命令查…

初学者持续自我提升指南

这是一位长期关注自我提升方面的博主&#xff0c;在medium.com上发现的。 初学者持续自我提升指南 最佳自我改善文章 自我改善几乎总是从自我意识和改变习惯的能力开始。如果你认真改变自己的生活并改善自己&#xff0c;那么你应该从这两篇文章开始&#xff1a; 如何停止对自己…

ntp服务器池列表

ntp服务器池列表 CentOS&#xff1a; 0.centos.pool.ntp.org 1.centos.pool.ntp.org 2.centos.pool.ntp.org 国内可用的 ntp.fudan.edu.cn 复旦 210.72.145.44 国家守势中心服务器 亚洲地区的ntp服务器 Bangladesh — bd.pool.ntp.org (0) China — cn.pool.ntp.org (3) Hong K…

LINQ to SQL学习的几个问题

问题一&#xff1a; 什么情况下我们使用自动属性功能&#xff0c;生成自动属性时内部没有明确的私有变量那么我们如何访问这个私有变量呢&#xff1f; 如果不能那我们的封装还有什么存在的意义&#xff1f; Code1 /**//// <summary> 2 /// net 2.0中使用的方法来定义…

linux 运行pfx文件,Linux下pfx证书导出key和crt

Linux下.pfx证书导出.key和.crt1.确定openssl路径&#xff1a;openssl version -aOpenSSL 1.0.1e-fips 11 Feb 2013built on: Mon Jun 29 12:45:07 UTC 2015platform: linux-x86_64options: bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx)comp…

C# foreach遇到async和await

一个简单的列子&#xff0c;需要把一个集合的数据添加到数据库中。 我先这样写了&#xff0c;然后报错了 public async Task<IHttpActionResult> Test([FromUri]string name ""){List<string> strList new List<string>() { "测试", &…

BZOJ2584 : [Wc2012]memory

xy方向分开考虑 用扫描线处理出拓扑序&#xff0c;第二问直接回答拓扑序&#xff0c; 第一问&#xff1a; 将操作倒过来&#xff0c;变成加入线段&#xff0c;用线段树维护区间拓扑序的最值 #include<cstdio> #include<algorithm> #include<set> #define N 1…