创建两个进程,定义一个共享内存,内存中存储char str[10]= "1234567";要求如下
A循环打印str;
B循环倒置str; 不能使用辅助数组;
要求出现的结果没有乱序,只能出现 1234567 7654321
不允许使用sleep函数
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/sem.h>
int main(int argc, const char *argv[])
{
key_t key=ftok("./123",10);
if(key<0)
{
perror("ftok");
return -1;
}
int semid =semget(key,2,IPC_CREAT|0664);
if(semid<0)
{
perror("semget");
return -1;
}
unsigned short arr[2]={0,1};
if(semctl(semid,0,SETALL,arr)<0)
{
perror("semctl");
return -1;
}
int shmid=shmget(key,128,IPC_CREAT|0664);
if(shmid<0)
{
perror("shmid");
return -1;
}
void* shmaddr=shmat(shmid,NULL,0);
if(((void*)-1==shmaddr))
{
perror("shmaddr");
return -1;
}
char *str=(char*)shmaddr;
strcpy(str,"1234567");
struct sembuf sop;
pid_t cpid=fork();
if(cpid==0)
{
while(1)
{
sop.sem_num=1;
sop.sem_op=-1;
sop.sem_flg=0;
if(semop(semid,&sop,1)<0)
{
perror("semop");
return -1;
}
printf("%s\n",str);
sop.sem_num=0;
sop.sem_op=+1;
sop.sem_flg=0;
if(semop(semid,&sop,1)<0)
{
perror("semop");
return -1;
}
}
}
else if(cpid>0)
{
while(1)
{
sop.sem_num=0;
sop.sem_op=-1;
sop.sem_flg=0;
if(semop(semid,&sop,1)<0)
{
perror("semop");
return -1;
}
char *p=NULL;
char *q=NULL;
char temp=0;
p=str;
q=p+strlen(str)-1;
while(p<q)
{
temp=*p;
*p=*q;
*q=temp;
p++;q--;
}
sop.sem_num=1;
sop.sem_op=+1;
sop.sem_flg=0;
if(semop(semid,&sop,1)<0)
{
perror("semop");
return -1;
}
}
}
else
{
perror("fork");
return -1;
}
return 0;
}