1. 管道
  2. 共享内存
  3. 消息队列
  4. 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 VPOSIX接口。我用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将共享内存映射到进程的地址空间
  1. 使用 shm_open 创建一个新的或打开一个共享内存对象。
  2. 使用 ftruncate 设置共享内存对象的大小。
  3. 使用 mmap 将共享内存映射到进程的地址空间。
  4. 通过 fork 创建一个新的进程。
  5. 在子进程中,向共享内存写入数据。
  6. 在父进程中,等待子进程结束后,从共享内存读取数据。
  7. 使用 munmap 解除映射。
  8. 使用 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状态。

更新时间: