信号灯集和共享内存实现收发
#include "test.h"
#include "sem.h"
#define PAGESIZE 4096
void send(int shmid, int semid)
{
char* addr = shmat(shmid, NULL, 0);
if (addr == (void*)-1)
{
perror("shmat error");
return;
}
printf("addr = %p\n", addr);
while (1)
{
P(semid, 0);
printf("请输入:");
fgets(addr, PAGESIZE, stdin);
addr[strlen(addr) - 1] = 0;
printf("数据发送成功\n");
V(semid, 1);
if (strcmp(addr, "quit") == 0 || \
strcmp(addr, "q") == 0)
{
break;
}
}
if (shmdt(addr) == -1)
{
perror("shmdt error");
return;
}
}
void recv(int shmid, int semid)
{
char* addr = shmat(shmid, NULL, 0);
if (addr == (void*)-1)
{
perror("shmat error");
return;
}
printf("addr = %p\n", addr);
while (1)
{
P(semid, 1);
printf("收到的数据为:%s\n", addr);
V(semid, 0);
if (strcmp(addr, "quit") == 0 || \
strcmp(addr, "q") == 0)
{
break;
}
}
if (shmdt(addr) == -1)
{
perror("shmdt error");
return;
}
}
int main(int argc, char const *argv[])
{
int semid = open_sem(2);
key_t key = -1;
if ((key = ftok("/", 'k')) == -1)
{
perror("ftok error");
return -1;
}
printf("ftok success key = %#x\n", key);
int shmid = -1;
if ((shmid = shmget(key, PAGESIZE, IPC_CREAT|0664)) == -1)
{
perror("shmget error");
return -1;
}
printf("shmget success shmid = %d\n", shmid);
int n;
printf("请输入选项:");
scanf("%d", &n);
getchar();
if (n == 1)
{
send(shmid, semid);
}
else if (n == 2)
{
recv(shmid, semid);
}
if (shmctl(shmid, IPC_RMID, NULL) == -1)
{
perror("shmctl error");
return -1;
}
del_sem(semid);
return 0;
}