- 管道
- 共享内存
- 消息队列
- Socket
管道
popen
库函数,它用于创建一个管道,并且同时启动一个新的进程,然后将这个启动的新进程的标准输入或标准输出与管道连接起来。(man 3 popen)
- 这允许当前程序与新启动的程序之间进行数据交互
- 实际上是对pipe(),fork()等函数的高级封装
FILE *pipe = popen("ls","r");//如在终端执行ls,r为读 fread(buf,1,sizeof(buf),pipe); printf("%s",buf); pclose(pipe); wait(NULL)阻塞调用进程,直到一个子进程终止。 回收子进程的资源,避免产生僵尸进程。NULL表示对子进程状态不感兴趣
共享内存
- 随着进程数量增加,因pipe为系统调用,所以性能损耗很大。共享内存可以解决该问题
- 对于进程而言,代码中所使用与的地址都是虚拟地址,操作的是虚拟地址空间,就是如果代码中两进程都用了同一个地址,实际上用的并非同一个地址。
- 而共享内存就允许两个或者多个进程共享一个给定的物理存储区域
- 怎么共享的? 把两个或者更多的进程, 的某些数据的虚拟地址, 经过映射之后, 映射到相同物理内存上
- _为了实现内存共享,内核会专门维护一个用来存储共享内存信息的数据结构 : 其中包括共享内存大小、权限、引用进程数量…
- 对于Linux的共享内存, 有两个常见的版本
System V
和POSIX接口
。我用POSIX接口吧,System V老了gpt说是int shm_fd = shm_open("/haha", O_RDWR|O_CREAT, 0666);//shm_open创建一个新的或打开一个共享内存对象。 //shm = share memory ftruncate(shm_fd, 4096);//ftruncate设置共享内存对象的大小 void *ptr = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0);//mmap将共享内存映射到进程的地址空间
- 使用
shm_open
创建一个新的或打开一个共享内存对象。- 使用
ftruncate
设置共享内存对象的大小。- 使用
mmap
将共享内存映射到进程的地址空间。- 通过
fork
创建一个新的进程。- 在子进程中,向共享内存写入数据。
- 在父进程中,等待子进程结束后,从共享内存读取数据。
- 使用
munmap
解除映射。- 使用
shm_unlink
删除共享内存对象。
sigpending
sigset_t set;//创建set
sigfillset(&set);//所有信号全填进set
sigemptyset(&set);//置空set
sigpending(&set);//把pending的放进set
if(sigismember(&set,3))//3是不是在set里,即3是否pending状态。