![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux进程间通信
文章平均质量分 77
vancounver
这个作者很懒,什么都没留下…
展开
-
1 进程与线程
最近在看马小陆老师的进程间通信视频,感觉讲的很好,里面包含很多实用的例子说明,很有必要做个笔记,忘记了还可以回头看看。1. 进程通信:在用户空间是不能实现进程间通信的,只能通过Linux内核空间,创建对应的对象,实现进程间通信;对象不同,通信方式名字也就不一样。比如内核创建管道对象,对应的就是管道通信。2. 线程通信:用户空间就可以实现互相通信,比如全局变量。3. 进程间通信分原创 2017-01-20 19:29:43 · 788 阅读 · 1 评论 -
20 semaphore 2
1. 示例一:线程使用信号量#include "stdio.h"#include "stdlib.h"#include "pthread.h"#include "semaphore.h"#include "unistd.h"sem_t sem;void *fun(void *var)//child thread code{ int j; //p wait sem_wa原创 2017-01-24 14:47:32 · 364 阅读 · 0 评论 -
17 消息队列2
1. 同一进程间发送接收信息示例,熟练使用几个函数。2. 示例,创建消息队列 --> 写队列,类型100,--> 第一次读队列 --> 第二次读队列(阻塞) --> 删除队列:#include "sys/types.h"#include "sys/msg.h"#include "signal.h"#include "unistd.h"#include "stdio.h"#原创 2017-01-24 09:22:56 · 286 阅读 · 0 评论 -
16 消息队列1
1. 管道、队列 与IPC的消息队列有什么区别呢?消息队列是链式的,消息的类型可以不一致。消息队列中维护队列的结构体msqid_ds,其中的第一个消息指针msg_first,最后一个指针msg_last..每个消息中包含数据data,数据的长度length,数据的类型type。2. 消息队列创建函数msgget创建了消息队列后可以通过system("ipcs -原创 2017-01-22 20:41:19 · 368 阅读 · 0 评论 -
15 共享内存5-非亲缘关系进程通信
1. 实例一,server#include "sys/types.h"#include "sys/shm.h"#include "signal.h"#include "unistd.h"#include "stdio.h"#include "stdlib.h"#include "string.h"struct mybuf{ int pid; char buf[124];原创 2017-01-21 22:20:07 · 938 阅读 · 0 评论 -
14 共享内存4
1. 使用共享内存进行亲缘关系的进程间通信,当使用IPC_PRIVATE实现时,fork函数一定要在shmget函数之后。父子进程要分别进行内存映射。2. 实例a. 父进程完成内存映射后,等待读取用户输入信息;当输入完成后,通过kill向子进程发送SIGUSR1信号告知有消息可读,同时父进程进入睡眠状态;b. 子进程完成内存映射后,就进入休眠状态;当收到信号后,进程唤醒,并从共原创 2017-01-21 21:39:29 · 432 阅读 · 0 评论 -
13 共享内存3
1. 删除进程中的地址映射shmdt原型: int shmdt(const void *shmaddr)参数: shmaddr共享内存映射后的地址返回: 成功0,出错-12. 删除共享内存对象shmctl原型: int shmctl(int shmid, int cmd, struct shmid_ds * buf)参数: shmid,要操作的原创 2017-01-21 21:07:45 · 293 阅读 · 0 评论 -
12 共享内存2
1. 使用shmget函数创建共享内存时,参数如果是IPC_PRIVATE,则共享内存的key值都一样,为0。如果要使key非0,则需要借助函数ftok。只要key值一样,用户空间的进程通过函数打开,就会对内核的同一个IPC对象进行操作。2. ftok函数:原型: char ftok(const char *path, char key)参数: path:文件路劲和文件原创 2017-01-21 20:23:10 · 350 阅读 · 1 评论 -
11 共享内存1
1. IPC:inter-process communication,接下来需要了解的三种IPC:共享内存Shared memory,信号灯semophore、消息队列message queue。有名管道可以再无亲缘关系的进程间通信,是因为用户空间有管道这种文件类型。而这三种IPC,用户空间是没有对应的文件类型的。ftok key可以保证用户空间的二个进程对同一个IPC对象进程操作。2原创 2017-01-21 20:15:47 · 403 阅读 · 0 评论 -
10 信号处理5
1. 多次设置进程的处理方式时,进程会使用最新的处理方式:实例中,alarm使用默认处理方式。#include "stdio.h"#include "sys/types.h"#include "signal.h"#include "stdio.h"#include "stdlib.h"void myfun(int signum){ int i; i=0; while原创 2017-01-21 16:18:10 · 445 阅读 · 0 评论 -
9 信号通信4
1. 信号处理,进程接收信号的处理方式:a. 采用进程默认的处理方式,内核默认:忽略、终止进程、暂停;b. 自己的处理方式:注册信号处理函数signal2. Signal函数:‘头文件: #include 函数原型: void (*signal(int signum, void (*handler)(int)))(int)参数: signum:指定信号原创 2017-01-21 16:01:41 · 365 阅读 · 0 评论 -
8 信号通信3
1. 闹钟信号发送函数alarm:头文件: #include 函数原型: unsigned int alarm(unsined int seconds)参数: seconds,指定秒数返回值: 成功:如果调用此次alarm前,进程已经有闹钟时间,则返回上一个闹钟时间的剩余时间,否则0;出错-12. alarm函数与raise函数比较:相同点:让内原创 2017-01-21 15:23:27 · 362 阅读 · 0 评论 -
7 信号通信2
0. 信号通信框架:信号发送:kill、raise、alarm信号接收:pause()、sleep、while(1);信号处理:signal1. 信号的发送函数:kill:发送信号给任意进程raise:只能发送给当前进程,等于kill(getpid(),sig)alram:发送闹钟信号2. kill函数:头文件: #include #in原创 2017-01-21 14:48:36 · 339 阅读 · 0 评论 -
6 信号通信1
1. 信号通信,其实就是内核向用户空间进程发送信号。只有内核才能发信号,用户空间进程不能发信号。2. 通过命令 kill -l 可以查看内核可以发送的全部信号,linxu存在64种:alex@alex-virtual-machine:/extra/process$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) S原创 2017-01-21 14:19:02 · 383 阅读 · 0 评论 -
5 有名管道
1. mkfifo函数形式:int mkfifo(const char * filename, mode_t mode);功能:创建管道文件参数:管道文件名;权限,文件权限仍然和umask有关返回:成功返回0,失败返回-12. mkfifo调用内核,内核在文件系统中生成文件名,并没有在内核中生成管道。只有在调用open代开有名管道时,才会在内核中创建管道。原创 2017-01-21 13:59:12 · 327 阅读 · 0 评论 -
4 有名管道1
1. 无名管道只能在有亲缘关系的进程中进行通信,针对这一缺点进行改进,出现有名管道。 有名,即文件系统中存在对应文件节点,每个文件节点都有一个inode号。有名管道的文件类型是p,之前文件IO中认识的文件类型有:普通文件-,目录文件d,链接文件l。2. 创建方式:open: 普通文件mkfifo: 创建管道socket:创建套接字mknod:字符设备文原创 2017-01-21 13:23:01 · 330 阅读 · 0 评论 -
3 无名管道2
1. 无名管道的缓存是由大小的,缓存满了,会出现写阻塞。2. 实例1,计算缓存大小:#include "unistd.h"#include "stdio.h"#include "stdlib.h"#include "string.h"int main(){ int fd[2]; int ret; int i=0; char writebuf[]="hello li原创 2017-01-20 22:30:15 · 501 阅读 · 0 评论 -
2 无名管道1
1. 管道文件是一个特殊文件,它由队列实现的。在文件IO中,创建、打开一个文件是由open函数实现,但是无名管道不能用open创建,对应的函数是pipe。创建:pipe读:read写:write关闭:close无名管道的无名是指在它在文件系统中无文件名。2. pipe:函数形式:int pipe(int fd[2]);功能:创建管道,为系统调用:unistd原创 2017-01-20 21:56:13 · 369 阅读 · 0 评论 -
21 semaphore 3
1. 示例,多进程间信号灯通信:需要先执行Client程序,再执行Server。Server端程序#include "stdio.h"#include "stdlib.h"#include "pthread.h"//#include "semaphore.h"#include "sys/ipc.h"#include "sys/sem.h"#include "unistd.h原创 2017-01-24 16:07:54 · 266 阅读 · 0 评论