⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 10-8.c

📁 《Linux应用开发技术详解》附书光盘中的例程。
💻 C
字号:
#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <signal.h>

#if defined(_GNU_LIBRARY_) && !defined(_SEM_SEMUN_UNDEFINED)
/* union semun is defined by including <sys/sem.h> */
#else
/* according to X/OPEN we have to define it ourselves */
union semun {
      int val;                  /* value for SETVAL */
      struct semid_ds *buf;     /* buffer for IPC_STAT, IPC_SET */
      unsigned short *array;    /* array for GETALL, SETALL */
                                /* Linux specific part: */
      struct seminfo *_buf;    /* buffer for IPC_INFO */
};
#endif

#define PROJID 0xFF
int semid;
int shmid;

void terminate_handler(int signo)
{
	semctl(semid, 0, IPC_RMID);
	shmctl(shmid, IPC_RMID, NULL);
	exit(0);
}

int main(void)
{
	char filenm[] = "shared-file";
	char * shm_addr;
	key_t semkey;
	struct sembuf getsem, setsem;
	union semun seminit;
	key_t shmkey;
	int ret;

	semkey = ftok(filenm, PROJID);
	if (semkey == -1) {
		perror("ftok error: ");
		exit(-1);
	}

	semid = semget(semkey, 2, IPC_CREAT | IPC_EXCL | 0666);
	if (semid == -1) {
		perror("semget error: ");
		exit(-1);
	}
	seminit.val = 0;
	semctl(semid, 0, SETVAL, seminit);
	semctl(semid, 1, SETVAL, seminit);

	getsem.sem_num = 1;
        getsem.sem_op = -1;
        getsem.sem_flg = SEM_UNDO;

	setsem.sem_num = 0;
        setsem.sem_op = 1;
        setsem.sem_flg = SEM_UNDO;

	signal(SIGINT, terminate_handler);
	signal(SIGTERM, terminate_handler);

	shmkey = ftok(filenm, PROJID + 0x0F00);
	if (shmkey == -1) {
		perror("ftok error: ");
		exit(-1);
	}

	shmid = shmget(shmkey, 4096, IPC_CREAT | IPC_EXCL | 0666);
	if (shmid == -1) {
		perror("shmget error: ");
		exit(-1);
	}
	shm_addr = (char *)shmat(shmid, NULL, 0);
	if (shm_addr == (char *)-1) {
		perror("shmat error: ");
		semctl(semid, 0, IPC_RMID);
		shmctl(shmid, IPC_RMID, NULL);
		exit(-1);
	}

	while (1) {
		printf("Lucy: ");
		fgets(shm_addr, 256, stdin);
		if (strncmp("quit", shm_addr, 4) == 0) {
			if (shmdt(shm_addr) == -1) {
				perror("shmdt error: ");
			}
			semctl(semid, 0, IPC_RMID);
			shmctl(shmid, IPC_RMID, NULL);
			exit(0);
		}
		shm_addr[strlen(shm_addr)-1] = '\0';
		ret = semop(semid, &setsem, 1);
		if (ret == -1) {
			perror("semop error: ");
		}
		ret = semop(semid, &getsem, 1);
		if (ret == -1) {
			perror("semop error: ");
		}
		printf("Peter: %s\n", shm_addr);
	}
		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -