文章目录
一、题目
二、相关知识
1)共享内存
0.以下函数所用的头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
1.shmget()函数----用于创建共享内存
2.shmat()函数----用于建立映射
3.shmdt()函数----用于解除映射
4.shmctl()函数
2)POSIX信号量
POSIX信号量又分为有名信号量和无名信号量。有名信号量可以用于多个进程间或多个线程间同步,和一个文件的路径名相关联;无名信号量通常只能用于同一进程所创建的线程间同步。有名信号量创建后不随进程结束而消失(可用于进程间通信),反之无名信号量则只在进程生命周期内存在且只能在该进程创建的线程间使用(或通过共享内存在不同进程间使用)。两者的创建函数不同,但是相应的P/V操作函数是一样的。
0.头文件
#include <semaphore.h>
1.sem_open()函数----用于创建或打开一个信号量
2.sem_wait()函数----用于进行p操作
3.sem_post()函数----用于进行v操作
4.sem_getvalue()函数和sem_unlink()函数
三、代码
1.Utilities.h
#ifndef UTILITIES_H
#define UTILITIES_H
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <unistd.h>
#define LINE_SIZE 256
#define LINE_NUM 10
#define KEY_FILE "semfile"
//**************Begin*****************
struct shared_use_st
{
int Index[LINE_NUM];
char Buffer[LINE_NUM][LINE_SIZE];
sem_t sem;
};
//**************End*******************
#endif
2.Producer.c
#include "Utilities.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
//******************Begin**************************
//在生产者进程中创建共享内存
key_t key = ftok(KEY_FILE, 0);
int shm_id = shmget(key, LINE_SIZE, 0666 | IPC_CREAT);