0807C语言进程线程笔记

函数:

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的获取、操作、删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱咬杜邦线

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值