69,382
社区成员
发帖
与我相关
我的任务
分享
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <errno.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <unistd.h>
#include <stdlib.h>
#define SHM_SIZE 1024
union semun {
int val;
struct semid *buf;
unsigned short *array;
};
int wait_sem(int semId, int Index);
int main(void)
{
int semId, shmId;
char *shmaddr;
char write_str[SHM_SIZE] = {0};
key_t shkey, semkey;
union semun semopts;
struct sembuf serSemBuf = {0, -1, IPC_NOWAIT};
if ((shkey = ftok(".", 'm')) == -1) {
perror("write sh ftok failed!\n");
return -1;
}
if ((shmId = shmget(shkey, SHM_SIZE, IPC_CREAT |
0666)) == -1) {
perror("write shmget failed!\n");
return -1;
}
if ((shmaddr = shmat(shmId, (char *)0, 0)) ==
(char *)-1) {
perror("write shmat failed!\n");
return -1;
}
if ((semkey = ftok(".", 's')) == -1 ) {
perror("write sem ftok failed!\n");
return -1;
}
if ((semId = semget(semkey, 1, IPC_CREAT | 0666)) == -1) {
perror("write semget failed!\n");
return -1;
}
semopts.val = 1;
if (semctl(semId, 0, SETVAL, semopts) == -1) {
perror("write semctl failed!\n");
return -1;
}
while (1) {
wait_sem(semId, 0);
serSemBuf.sem_num = 0;
serSemBuf.sem_op = -1;
serSemBuf.sem_flg = IPC_NOWAIT;
if (semop(semId, &serSemBuf, 1) == -1) {
perror("write semop_p failed!\n");
return -1;
}
printf("write : ");
fgets(write_str, SHM_SIZE, stdin);
write_str[SHM_SIZE] = 0;
strcpy(shmaddr, write_str);
sleep(3);
serSemBuf.sem_num = 0;
serSemBuf.sem_op = 1;
serSemBuf.sem_flg = IPC_NOWAIT;
if (semop(semId, &serSemBuf, 1) == -1) { //程序在这里退出,报错identifier removed
perror("Write semop_v failed!\n");
return -1;
}
sleep(3);
}
return 0;
}
int wait_sem(int semId, int Index)
{
while (semctl(semId, Index, GETVAL, 0) == 0) {
sleep(1);
}
return 1;
}