4.1 管道
- 有名管道的创建
- 库函数
- mkfifo
4.1.1 popen和pclose
- popen和pclose是一个库函数,即在windows中也可以使用。
size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
4.1.2 pipe
-
在fork之前打开的文件对象,在fork之后是共享的
-
只读不写会阻塞,只写不读不会阻塞。
-
4.1.3 FIFO
4.2 共享内存
- 最快的IPC
使用的原因
System V 版本的共享内存
- taskset -c 0 ./a.out 只使用0号cpu
创建/获取共享内存
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
int shmid = shmget(IPC_PRIVATE, 1024, IPC_CREAT | 0666);
if (shmid == -1) {
perror("shmget");
exit(1);
}
struct shmid_ds shminfo;
// 查看共享内存信息
shmctl(shmid, IPC_STAT, &shminfo);
printf("Before attach: nattch = %ld\n", shminfo.shm_nattch);
// 进程附加共享内存
char *shmaddr = (char *)shmat(shmid, NULL, 0);
if (shmaddr == (void *)-1) {
perror("shmat");
exit(1);
}
// 再次查看共享内存信息
shmctl(shmid, IPC_STAT, &shminfo);
printf("After attach: nattch = %ld\n", shminfo.shm_nattch);
// 进程分离共享内存
shmdt(shmaddr);
// 再次查看共享内存信息
shmctl(shmid, IPC_STAT, &shminfo);
printf("After detach: nattch = %ld\n", shminfo.shm_nattch);
// 删除共享内存
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
进程间的通信
共享内存可以在两个互不关联的进程之间进行通信,只需要彼此之间知道共享内存的键就好了。
先后执行shm_w和shm_r程序,后一个进程可以读取共享内存中前一个进程写入的信息
两个进程同时对共享内存写入
- 共享内存可以实现多个进程同时对同一个数据进行访问和修改,这种并发的操作往往会造成预期外的错误。
解除共享内存映射
- 使用 shmdt 可以解除堆空间到共享内存段的映射。具体的使用方法和 free 差不多。
修改共享内存属性
- ipcrm -m 也是删除共享内存