任务要求:
创建两个进程,定义一个共享内存,内存中存储char str[10]="1235467";要求如下
1 A进程循环打印str
2 B进程循环倒置str,不能使用辅助数组
3 要求出现的结果没有乱序,只能出现1234567或者7654321
4 不允许使用sleep函数
逻辑思维:
设置两个灯;
第一个灯+1:A先输出一次str,等待第二个灯-1;
第一个灯 -1:B排序一次str,随后第二个灯+1;
A进程代码如下:
#include<stdio.h>
#include<sys/sem.h>
#include<sys/ipc.h>
#include<sys/types.h>
#include<sys/shm.h>
#include<string.h>
int main(int argc, const char *argv[])
{
//创建key
key_t key=ftok("./",9);
if(key < 0)
{
perror("ftok");
return -1;
}
//创建key
key_t key_1=ftok("./",1);
if(key_1 < 0)
{
perror("ftok");
return -1;
}
//创建共享内存
int shmID=shmget(key_1,128,IPC_CREAT|0775);
//利用共享内存号连接到用户空间
void* shmaddr1 = shmat(shmID,NULL,0);
if((void*)-1 == shmaddr1)
{
perror("shmat");
return -1;
}
char* shmaddr=(char*)shmaddr1;
strcpy(shmaddr,"1234567");
printf("%s\n",shmaddr);
//创建灯集,返回值为信号灯号
//第一个key,第二个灯集的灯数量,第三个创建
int semNo_1 =semget(key,2,IPC_CREAT|0775);
if(semNo_1 < 0)
{
perror("semget");
return -1;
}
//对灯集的操作
int i=3;
while(i)
{
printf("准备输出\n");
struct sembuf sops;
sops.sem_num=0;
sops.sem_op=+1;
sops.sem_flg=0;
semop(semNo_1,&sops,1);
printf("%s\n",shmaddr);
//怎么对灯集里的灯操作
sops.sem_num=1;
sops.sem_op=-1;
sops.sem_flg=0;
semop(semNo_1,&sops,1);
i--;
}
//
shmdt((void*)shmaddr);
shmctl(shmID,IPC_RMID,NULL);
semctl(semNo_1,0,IPC_RMID);
return 0;
}
B进程代码如下:
#include<stdio.h>
#include<sys/sem.h>
#include<sys/ipc.h>
#include<sys/types.h>
#include<sys/shm.h>
#include<string.h>
int main(int argc, const char *argv[])
{
//创建key
key_t key=ftok("./",9);
if(key < 0)
{
perror("ftok");
return -1;
}
//创建key
key_t key_1=ftok("./",1);
if(key_1 < 0)
{
perror("ftok");
return -1;
}
//创建共享内存
int shmID=shmget(key_1,128,IPC_CREAT|0775);
//利用共享内存号连接到用户空间
void* shmaddr1 = shmat(shmID,NULL,0);
if((void*)-1 == shmaddr1)
{
perror("shmat");
return -1;
}
//共享空间坐标转换成char类型
char* shmaddr=(char*)shmaddr1;
strcpy(shmaddr,"1234567");
printf("%s\n",shmaddr);
//创建灯集,返回值为信号灯号
//第一个key,第二个灯集的灯数量,第三个创建
int semNo_1 =semget(key,2,IPC_CREAT|0775);
if(semNo_1 < 0)
{
perror("semget");
return -1;
}
//对灯集的操作
int time=3;
while(time)
{
printf("等待排序\n");
struct sembuf sops;
sops.sem_num=0;
sops.sem_op=-1;
sops.sem_flg=0;
semop(semNo_1,&sops,1);
//排序
int n = strlen(shmaddr);
char a='0';
for(int i=0; i<n/2 ;i++)
{
bzero(&a,sizeof(char));
a=*(shmaddr+i);
*(shmaddr+i)=*(shmaddr+n-1-i);
*(shmaddr+n-i-1)=a;
}
//怎么对灯集里的灯操作
sops.sem_num=1;
sops.sem_op=+1;
sops.sem_flg=0;
semop(semNo_1,&sops,1);
time--;
}
//
shmdt((void*)shmaddr);
shmctl(shmID,IPC_RMID,NULL);
semctl(semNo_1,0,IPC_RMID);
return 0;
}
效果图如下: