作业1:共享内存
shmsnd.c:
#include <myhead.h>
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
//一、创建key值
key_t key=-1;
if((key=ftok("/",'k'))==-1){
perror("ftok error");
return -1;
}
//二、根据key值创建共享内存
int shmid=-1;
if((shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664))==-1){
perror("shmget error");
return -1;
}
//三、将共享内存附加到用户空间
char *addr=shmat(shmid,NULL,0);
//四、使用共享内存
while(1)
{
//从终端输入数据
printf("请输入>>>");
fgets(addr,PAGE_SIZE,stdin);
addr[strlen(addr)-1]='\0';
if(strcmp(addr,"quit")==0){
break;
}
}
//五、分离共享内存
if(shmdt(addr)==-1){
perror("shmdt error");
return -1;
}
//六、删除共享内存
if(shmctl(shmid,IPC_RMID,NULL)==-1){
perror("delete error");
return -1;
}
return 0;
}
shmrcv:
#include <myhead.h>
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
//一、创建key值
key_t key=-1;
if((key=ftok("/",'k'))==-1){
perror("ftok error");
return -1;
}
//二、根据key值创建共享内存
int shmid=-1;
if((shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664))==-1){
perror("shmget error");
return -1;
}
//三、将共享内存附加到用户空间
char *addr=shmat(shmid,NULL,0);
//四、使用共享内存
while(1)
{
sleep(1);
printf("收到的数据为:%s\n",addr);
if(strcmp(addr,"quit")==0){
break;
}
}
//五、分离共享内存
if(shmdt(addr)==-1){
perror("shmdt error");
return -1;
}
return 0;
}
效果图:
作业2:信号灯集
sem.h:
#ifndef __SEM_H__
#define __SEM_H__
//一、创建或打开信号灯集
//参数:信号灯集的id,信号灯集的个数
//返回值:信号灯集的id
int open_sem(int semcount);
//二、申请资源
//参数:信号灯集的id号,信号灯集中灯的编号
int P(int semid,int semno);
//三、释放资源
//参数:信号灯集的id号,信号灯集中灯的编号
int V(int semid,int semno);
//四、删除信号灯集
//参数:信号灯集的id号
int del_sem(int semid);
#endif
sem.c:
#include <myhead.h>
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
};
//定义初始化函数
int init_semno(int semid,int semno)
{
union semun buf;
printf("要给编号为%d的灯设置的值为:",semno);
scanf("%d",&buf.val);
getchar();
//给信号灯设置值
if(semctl(semid,semno,SETVAL,buf)==-1){
perror("set error");
return -1;
}
return 0;
}
//一、创建或打开信号灯集
//参数:信号灯集的id,信号灯集的个数
//返回值:信号灯集的id
int open_sem(int semcount)
{
//创建key值
key_t key=-1;
if((key=ftok("/",'s'))==-1){
perror("ftok error");
return -1;
}
//根据 key 值创建信号灯集
int semid=-1;
if((semid=semget(key,semcount,IPC_CREAT | IPC_EXCL | 0664))==-1){
if(errno==EEXIST){
semid=semget(key,semcount,IPC_CREAT|0664);
return semid;
}
perror("semget error");
return -1;
}
//对信号灯集中的每个信号灯进行初始化
for(int i=0;i<semcount;i++)
{
init_semno(semid,i);
}
return semid;
}
//二、申请资源
int P(int semid,int semno)
{
struct sembuf buf;
buf.sem_num=semno;
buf.sem_op=-1;
buf.sem_flg=0;
if((semop(semid,&buf,1))==-1){
perror("P error");
return -1;
}
return 0;
}
//三、释放资源
int V(int semid,int semno)
{
struct sembuf buf;
buf.sem_num=semno;
buf.sem_op=1;
buf.sem_flg=0;
if((semop(semid,&buf,1))==-1){
perror("V error");
return -1;
}
return 0;
}
//四、删除信号灯集
int del_sem(int semid)
{
if(semctl(semid,0,IPC_RMID)==-1){
perror("delete error");
return -1;
}
return 0;
}
shmsnd.c:
#include <myhead.h>
#include "sem.h"
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
//创建信号灯集
int semid=open_sem(2);
//创建key值
key_t key=-1;
if((key=ftok("/",'k'))==-1){
perror("ftok error");
return -1;
}
//根据key值创建共享内存
int shmid=-1;
if((shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664))==-1){
perror("shmget error");
return -1;
}
//将共享内存映射到用户空间
char *addr=shmat(shmid,NULL,0);
if(addr==(void*)-1){
perror("shmat error");
return -1;
}
//使用共享内存
while(1)
{
//申请0号资源
P(semid,0);
//将数据输入到共享内存
printf("请输入>>>");
fgets(addr,PAGE_SIZE,stdin);
addr[strlen(addr)-1]='\0';
//释放1号资源
V(semid,1);
if(strcmp(addr,"quit")==0){
break;
}
}
//分离共享内存
if(shmdt(addr)==-1){
perror("shmdt error");
return -1;
}
//删除共享内存
if(shmctl(shmid,IPC_RMID,NULL)==-1){
perror("delete error");
return -1;
}
/*
//删除信号灯集
del_sem(semid);
*/
return 0;
}
shmrcv.c:
#include <myhead.h>
#include "sem.h"
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
//创建信号灯集
int semid=open_sem(2);
//创建key值
key_t key=-1;
if((key=ftok("/",'k'))==-1){
perror("ftok error");
return -1;
}
//根据key值创建共享内存
int shmid=-1;
if((shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664))==-1){
perror("shmget error");
return -1;
}
//将共享内存映射到用户空间
char *addr=shmat(shmid,NULL,0);
if(addr==(void*)-1){
perror("shmat error");
return -1;
}
//使用共享内存
while(1)
{
//申请1号资源
P(semid,1);
printf("收到的数据为:%s\n",addr);
if(strcmp(addr,"quit")==0){
break;
}
//释放0号资源
V(semid,0);
}
//分离共享内存
if(shmdt(addr)==-1){
perror("shmdt error");
return -1;
}
//删除信号灯集
del_sem(semid);
return 0;
}
效果图: