循环打印
// 输入字符串1234567 使用信号灯集完成
// 1.A进程循环打印字符串
// 2.B进程循环逆置字符串
// 3.要求结果不允许出现乱序
#include <my_head.h>
int main(int argc,const char *argv[])
{
// 创建key值
key_t key = ftok("./",1);
// 创建共享内存并获取shmid
int shmid = shmget(key,64,IPC_CREAT|0664);
// 将共享内存映射到用户空间
void *shmaddr = shmat(shmid,NULL,0);
char *p = (char *)shmaddr;
// 往共享内存写入数据
strcpy(p,"1234567");
// 创建信号灯集并获取semid
int semid = semget(key,2,IPC_CREAT|0664);
// 初始化0号灯的值为1
semctl(semid,0,SETVAL,1);
// 初始化对0号灯和1号灯的操作
struct sembuf sops[2];
sops[0].sem_num=0; // 0号灯
sops[0].sem_op=-1; // P操作
sops[0].sem_flg=0; // 阻塞方式
sops[1].sem_num=1;// 1号灯
sops[1].sem_op=1; // V操作
sops[1].sem_flg=0;// 阻塞方式
while (1)
{
semop(semid,&sops[0],1); // 对0号灯P操作
printf("%s\n",p); // 打印共享内存里的字符串
semop(semid,&sops[1],1); // 对1号灯V操作
sleep(1);
}
return 0;
}
循环逆置
// 输入字符串1234567 使用信号灯集完成
// 1.A进程循环打印字符串
// 2.B进程循环逆置字符串
// 3.要求结果不允许出现乱序
#include <my_head.h>
int main(int argc,const char *argv[])
{
// 创建key值
key_t key = ftok("./",1);
// 创建信号灯集并获取semid
int semid = semget(key,1,IPC_CREAT|0664);
// 创建共享内存并获取shmid
int shmid = shmget(key,10,IPC_CREAT|0664);
// 将共享内存映射到用户空间
void *shmaddr = shmat(shmid,NULL,0);
char *p = (char *)shmaddr;
struct sembuf sops[2];
sops[0].sem_num=0; // 0号灯
sops[0].sem_op=1; // V操作
sops[0].sem_flg=0; // 阻塞方式
sops[1].sem_num=1; // 1号灯
sops[1].sem_op=-1; // P操作
sops[1].sem_flg=0; // 阻塞方式
printf("正在循环逆置\n");
while (1)
{
semop(semid,&sops[1],1); //对1号灯P操作
for(int i=0,j=strlen(p)-1;i<j;i++,j--)
{
char temp = *(p+i);
*(p+i) = *(p+j);
*(p+j) = temp;
}
semop(semid,&sops[0],1); // 对0号灯V操作
sleep(1);
}
// 删除共享内存
shmctl(shmid,IPC_RMID,NULL);
// 删除信号灯集
semctl(semid,0,IPC_RMID);
return 0;
}