函数:
1、pipe(int pipefd[2]); 直接创建无名管道
2、getpid() 和 getppid() 获取子进程id 和 获取父进程id
3、open()、read()创建无名管道
4、mkfifo(const char *pathname, mode_t mode);创建有名管道
5、access() 检查文件权限与是否存在:
R_OK
:检查读权限。W_OK
:检查写权限。X_OK
:检查执行权限。F_OK
:检查文件是否存在。
6、文件io:
fopen FILE *fopen(const char *path, const char *mode);
read ssize_t read(int fd, void *buf, size_t count);
7、ipcs ipcrm
ipcs -m: 显示系统中共享内存(share memory)
ipcs -q: 显示系统中消息队列(message queue)
ipcs -s: 显示系统中信号量(semaphore)
8、
1、msgget()创建/获取消息队列 // int msgget(key_t key, int msgflg);
`msgget()` 系统调用返回与给定的 `key` 参数值相关联的 System V 消息队列标识符。如果 `key` 具有值 IPC_PRIVATE,或者 `key` 不是 IPC_PRIVATE 且没有与给定的 `key` 值相关联的消息队列存在,并且 `msgflg` 中指定了 IPC_CREAT,则会创建一个新的消息队列。
简而言之,`msgget()` 用于获取或创建 System V 消息队列,并返回相应的消息队列标识符。
ftok() // key_t ftok(const char *pathname, int proj_id);
`ftok()` 函数使用给定路径名所指向的文件的身份(该文件必须是现有的且可访问的),以及 `proj_id` 的最低有效 8 位(`proj_id` 必须为非零值),生成一个 `key_t` 类型的 System V IPC 键,适用于在 `msgget(2)`、`semget(2)` 或 `shmget(2)` 中使用。
简而言之,`ftok()` 函数用于生成适用于 System V IPC 的键,可用于消息队列、信号量或共享内存等资源的标识。这个键的生成基于给定的文件路径和项目 ID 的低 8 位。
2、msgsnd/msgrcv 发送/接收消息
msgsnd
memset() // void *memset(void *s, int c, size_t n);
msgsnd()
和 msgrcv()
系统调用分别用于向 System V 消息队列发送消息和从队列接收消息。调用进程在发送消息时必须对消息队列具有写权限,而在接收消息时必须具有读权限。
msgp
参数是指向调用者定义的具有以下一般形式的结构的指针:
struct msgbuf {
long mtype; /* 消息类型,必须大于 0 */
char mtext[1]; /* 消息数据 */
};
mtext
字段是一个数组(或其他结构),其大小由 msgsz
指定,一个非负整数值。允许发送零长度的消息(即,没有 mtext
字段)。mtype
字段必须具有严格正整数值。接收进程可以使用此值进行消息选择(请参阅下面对 msgrcv()
的描述)。
简而言之,msgsnd()
用于向消息队列发送消息,msgrcv()
用于从消息队列接收消息。消息队列中的消息是通过 msgbuf
结构来传递的,其中包含消息类型和数据。接收进程可以使用消息类型来选择要接收的消息。
`msgsnd()` 系统调用将指向 `msgp` 的消息副本追加到由 `msqid` 指定的消息队列中。
如果队列中有足够的空间,`msgsnd()` 会立即成功。队列的容量由消息队列的关联数据结构中的 `msg_qbytes` 字段控制。在创建队列时,此字段会初始化为 `MSGMNB` 字节,但此限制可以使用 `msgctl(2)` 进行修改。如果以下条件之一成立,则认为消息队列已满:
* 向队列添加新消息会导致队列中的总字节数超过队列的最大大小(`msg_qbytes` 字段)。
* 向队列添加另一条消息会导致队列中的消息总数超过队列的最大大小(`msg_qbytes` 字段)。此检查是为了防止将无限数量的零长度消息放入队列中。尽管这些消息不包含任何数据,但它们仍然会占用(被锁定的)内核内存。
如果队列中没有足够的空间,那么 `msgsnd()` 的默认行为是阻塞,直到空间可用。如果在 `msgflg` 中指定了 `IPC_NOWAIT`,则调用将失败并返回错误码 `EAGAIN`。
如果阻塞的 `msgsnd()` 调用失败,可能是因为:
* 队列被移除,此时系统调用将失败,并将 `errno` 设置为 `EIDRM`。
* 捕获到一个信号,此时系统调用将失败,并将 `errno` 设置为 `EINTR`;参见 `signal(7)`。(不管在建立信号处理程序时是否设置了 `SA_RESTART` 标志,`msgsnd()` 在被信号处理程序中断后永远不会自动重新启动。)
magrcv
3、msgctl删除队列
4、共享内存
shmget();
semop()
ipc的获取、操作、删除