要求先在共享内存中存入字符串 “1234567”。
A进程循环打印字符串,B进程循环倒置字符串,要求结果不允许出现乱序:
提示:共享内存+信
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sem.h>
int main(int argc, const char *argv[])
{
key_t key = ftok("/home/ubuntu/",2);
if(key<0)
{
perror("ftok");
return -1;
}
printf("key=%#X\n",key);
int shmid = shmget(key,128,IPC_CREAT|0664);
if(shmid<0)
{
perror("shmget");
return -1;
}
printf("shmid=%d\n",shmid);
int semid = semget(key,2,IPC_CREAT|0664);
if(semid<0)
{
perror("semid");
return -1;
}
unsigned short arr[2]={0,1};
if(semctl(semid,0,SETALL,arr)<0)
{
perror("semctl");
return -1;
}
void *addr = shmat(shmid,NULL,0);
if((void*)-1==addr)
{
perror("shmat");
return -1;
}
printf("addr=%p\n",addr);
char *ptr3=(char*)addr;
strcpy(ptr3 ,"1234567");
system("ipcs,-m");
struct sembuf sop;
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",ptr3);
sop.sem_num=0;
sop.sem_op=+1;
sop.sem_flg=0;
if(semop(semid,&sop,1)<0)
{
perror("semop");
return -1;
}
sleep(1);
}
return 0;
}
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/sem.h>
int main(int argc, const char *argv[])
{
key_t key = ftok("/home/ubuntu/",2);
if(key<0)
{
perror("ftok");
return -1;
}
int semid=semget(key,2,IPC_CREAT|0664);
if(semid<0)
{
perror("semid");
return -1;
}
int shmid=shmget(key,128,IPC_CREAT|0664);
if(shmid<0)
{
perror("shmget");
return -1;
}
void *addr = shmat(shmid,NULL,0);
if((void*)-1==addr)
{
perror("shmat");
return -1;
}
// printf("%d %c %s\n",*(int*)addr,*((char*)addr+4),(char*)addr+5);
char num=0;
char *ptr3 = (char*)addr;
char *start=NULL;
char *end=NULL;
struct sembuf sop;
while(1)
{
sop.sem_num =0;
sop.sem_op=-1;
sop.sem_flg=0;
if(semop(semid,&sop,1)<0)
{
perror("semop");
return -1;
}
start = ptr3;
end = start+strlen(ptr3)-1;
while(start<end)
{
num =*start;
*start=*end;
*end=num;
start++;
end--;
}
sop.sem_num=1;
sop.sem_op=+1;
sop.sem_flg=0;
if(semop(semid,&sop,1)<0)
{
perror("semop");
return -1;
}
}
system("ipcs -s");
return 0;
}