UC学习day15 线程同步之信号量 system v ipc 共享内存

一 线程同步之信号量
#include <semaphore.h>
int sem_init(sem_t *sem,int pshared,
unsigned int value);
功能:初始化一个信号量
参数:
sem: 指定了要初始化的信号量的地址
pshared: 0 多线程 非0 多进程
value:指定了信号量的个数
返回值:
成功 0
错误 -1 errno被设置
Link with -pthread.

int sem_destroy(sem_t *sem);
功能:销毁一个匿名的信号量
参数:
sem: 指定信号量的地址
返回值:
成功 0
错误 -1 errno被设置

#include <semaphore.h>
int sem_wait(sem_t *sem);
功能:锁定一个信号灯
如果信号灯的值>0,立即执行返回
如果当前信号灯的值为0.阻塞等待,直到信号灯的值变为>0
参数:
sem:指定要操作的信号灯的地址
返回值:
成功 0
错误 -1 errno被设置 sem的value不变
int sem_trywait(sem_t *sem);
功能:
参数:
返回值:

int sem_timedwait(sem_t *sem,
const struct timespec *abs_timeout);
功能:
参数:
返回值:

Link with -pthread.

int sem_post(sem_t *sem);
功能:信号量的值加1操作.
如果有其他线程阻塞等待这个信号量的值变为>0.这些线程将被唤醒并继续执行.
参数:
sem:指定要操作的信号量
返回值:
成功 0
错误 -1 errno被设置 sem的value不变

使用信号量实现生产者和消费者的例子
数据结构是一个环状队列

二 system v ipc

ftok(3)获取一个键值
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
功能:将pathname和proj_id的低有效8位生成system v ipc的键值
参数:
pathname: 指定一个文件的名字,文件必须是存在的,可访问的
proj_id:一个整型数字,但是只使用到低有效8位…非0
返回值:
错误 -1 errno被设置
成功 返回system v ipc的键值
注意:两个参数的值都相同的时候,生成的键值相同,否则不同.

消息队列
获取消息队列的id
msgget(2)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
功能:获取跟key相关的消息队列的id
参数:
key:指定键值 ftok(3)的返回值
msgflg:
IPC_CREAT 如果消息队列不存在,创建一个消息队列,返回该队列的id
IPC_EXCL 如果和上个标记一起使用,如果消息队列存在,报错
mode 指定消息队列的权限
返回值:
错误 -1 errno被设置为相应的错误码
成功 返回消息队列的id

使用消息队列的id操作消息队列
msgrcv(2) msgsnd(2)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msqid, const void *msgp,
size_t msgsz, int msgflg);
功能:将消息发送到消息队列中.一份拷贝
参数:
msqid:指定消息的目标队列的id
msgp:指定消息地址,把这里的数据发送到消息队列中
msgsz:指定了mtext字段的大小
msgflg:
0 如果空间不足,blocked
IPC_NOWAIT 空间不足,非阻塞 返回错误
返回值:
成功 0
错误 -1 errno被设置

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
功能:从消息队列中移除一条消息
参数:
msqid:指定了具体的消息队列,从这个消息队列中接收一条消息
msgp:指定了存放消息的地址空间
msgsz:指定了有msgp指向的结构体mtext成员的最大字节数
msgtyp:指定接收的消息的类型
msgflg:
IPC_NOWAIT 队列中没有消息的时候,非阻塞
0 队列中没有消息的时候 阻塞
返回值:
成功 实际接收到的字节数
错误 -1 errno被设置

struct msgbuf {
long mtype;/* message type, must be > 0 /
char mtext[1]; /
message data */
};

char mtext;
struct msgbuf msg;

使用消息队列实现进程间的通讯
send.c recv.c

共享内存
shmget(2)

#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
功能:分配一个system v的共享内存段
参数:
key:ftok(3)获取的system v 键值
size:指定了共享内存段的大小
shmflg:
IPC_CREAT:如果没有共享内存段,创建一个新的
IPC_EXCL:
mode 指定了共享内存段的权限
返回值:
错误 -1 errno被设置
成功 返回一个有效的共享内存段的id

shmat(2) shmdt(2)
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr,
int shmflg);
功能:将共享内存段附加到进程的地址空间
参数:
shmid:指定了共享内存段的id.
shmaddr:NULL 有内核选择附加共享内存段的地址
shmflg:0
返回值:
错误 (void *) -1 errno被设置为导致错误的原因
成功 返回进程的地址.

int shmdt(const void *shmaddr);
功能:分离共享内存段
参数:
shmaddr:指定要分离的共享内存段的起始地址
返回值:
成功 0
错误 -1 errno被设置

猜你喜欢

转载自blog.csdn.net/weixin_43789711/article/details/90113164