APUE:进程间通信

管道

半双工。一般由父进程创建,用于父子进程间、子进程间通信。匿名,一对一。

// fd[0] 只读
// fd[1] 只写
int pipe (int fd[2]);

简单执行命令行,并读写标准输入输出。

// 如果 modes == "r",返回标准输出
// 如果 modes == "w",返回标准输入
FILE *popen (const char *__command, const char *__modes);
int pclose (FILE *__stream);

 

FIFO(命名管道)

用法:服务端创建一个 FIFO,其它任何进程都可以向其写入数据,服务端读到数据后处理。可以一读多写。写数据的大小小于 PIPE_BUF 时为原子操作。

类似文件操作,包括用户/组/其它人的读写执行权限,删除需要 unlink。

int mkfifo (const char *__path, __mode_t __mode);
int mkfifoat (int __fd, const char *__path, __mode_t __mode);

  

POSIX 信号量

匿名信号量:同一进程不同线程使用。如果需要跨进程,需要将信号量结构体进行内存映射。

命名信号量:可以直接在不同进程中使用。

// 匿名信号量
int sem_init (sem_t *__sem, int __pshared, unsigned int __value)
int sem_destroy (sem_t *__sem);

// 打开已有信号量,oflag = 0
// 如果需要在信号量不存在时创建,oflag = O_CREAT,且必须指定 mode 的文件访问权限和 value 信号量初始值(0~SEM_VALUE_MAX)
sem_t *sem_open (const char *__name, int __oflag, ... /* mode_t mode, unsigned int value */);

int sem_close (sem_t *__sem);

// 没有人使用信号量后,自动删除
int sem_unlink (const char *__name);

// P
int sem_wait (sem_t *__sem);
int sem_timedwait (sem_t *__restrict __sem, const struct timespec *__restrict __abstime);
int sem_trywait (sem_t *__sem);

// V
int sem_post (sem_t *__sem);

 

共享存储

多个进程用相同的 key 使用 sh* 系列函数。

/* The following System V style IPC functions implement a shared memory
   facility.  The definition is found in XPG4.2.  */

/* Shared memory control operation.  */
extern int shmctl (int __shmid, int __cmd, struct shmid_ds *__buf) __THROW;

/* Get shared memory segment.  */
extern int shmget (key_t __key, size_t __size, int __shmflg) __THROW;

/* Attach shared memory segment.  */
extern void *shmat (int __shmid, const void *__shmaddr, int __shmflg)
     __THROW;

/* Detach shared memory segment.  */
extern int shmdt (const void *__shmaddr) __THROW;

  

 

转载于:https://www.cnblogs.com/mfmans/p/6916214.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值