shmry1.c
#include <code.h>
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'a');
if(key<0)
{
perror("ftok");
return -1;
}
int shmid = shmget(key , 128,IPC_CREAT|0664);
if(shmid<0)
{
perror("shmget");
return -1;
}
int semid = semget(key,2,IPC_CREAT|0664);
if(semid<0){
perror("semget");
return -1;
}
void *shmaddr = shmat(shmid,NULL,0);
if(shmaddr == (void *)-1)
{
perror("shmat");
return -1;
}
printf("shmaddr = %p\n",shmaddr);
char *ptr = (char *)shmaddr;
strcpy(ptr,"1234567");
struct sembuf sops[2];
sops[0].sem_num = 0;
sops[0].sem_op = 0;
sops[0].sem_flg = 0;
if(semop(semid,&(sops[0]),1)<0)
{
perror("semop");
return -1;
}
while(1)
{
sops[0].sem_op = -1;
if(semop(semid,&(sops[0]),1)<0)
{
perror("semop");
return -1;
}
printf("%s\n",ptr);
sleep(1);
sops[1].sem_flg = 0;
sops[1].sem_num = 1;
sops[1].sem_op = 1;
if(semop(semid,&(sops[1]),1)<0)
{
perror("semop");
return -1;
}
}
shmdt(shmaddr);
shmctl(shmid,IPC_RMID,NULL);
return 0;
}
shmry2.c
#include <code.h>
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'a');
if(key<0)
{
perror("ftok");
return -1;
}
printf("key = %#x\n",key);
int semid = semget(key,2,IPC_CREAT|0664);
if(semid<0){
perror("semget");
return -1;
}
int shmid = shmget(key , 128,IPC_CREAT|0664);
if(shmid<0)
{
perror("shmget");
return -1;
}
void *shmaddr = shmat(shmid,NULL,0);
if(shmaddr == (void *)-1)
{
perror("shmat");
return -1;
}
printf("shmaddr = %p\n",shmaddr);
char *ptr = (char *)shmaddr;
size_t size = strlen(ptr);
struct sembuf sops[2];
sops[0].sem_num = 0;
sops[0].sem_op = 1;
sops[0].sem_flg = 0;
if(semop(semid,&(sops[0]),1)<0)
{
perror("semop");
return -1;
}
while(1)
{
sops[1].sem_num = 1;
sops[1].sem_op = -1;
sops[1].sem_flg = 0;
if(semop(semid,&(sops[1]),1)<0)
{
perror("semop");
return -1;
}
for(int i=0;i<size/2;i++){
ptr[i] = ptr[i]^ptr[size-i-1];
ptr[size-i-1] = ptr[i]^ptr[size-i-1];
ptr[i] = ptr[i]^ptr[size-i-1];
}
sleep(1);
printf("倒置成功\n");
sops[0].sem_num = 0;
sops[0].sem_op = 1;
sops[0].sem_flg = 0;
if(semop(semid,&(sops[0]),1)<0)
{
perror("semop");
return -1;
}
}
shmdt(shmaddr);
shmctl(shmid,IPC_RMID,NULL);
return 0;
}
运行结果