10-9.c

来自「linux下一些命令的c语言的实现」· C语言 代码 · 共 73 行

C
73
字号
#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>

#define PROJID 0xFF
int main(void)
{
	char filenm[] = "shared-file";
	char * shm_addr;
	int semid, shmid;
	key_t semkey, shmkey;
	struct sembuf getsem, setsem;

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

	semid = semget(semkey, 0, 0);
	if (semid == -1) {
		perror("semget error: ");
		exit(-1);
	}

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

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

	shmkey = ftok(filenm, PROJID + 0x0F00);
        if (shmkey == -1) {
                perror("ftok error: ");
                exit(-1);
        }
                                                                                
        shmid = shmget(shmkey, 4096, 0);
        if (shmid == -1) {
                perror("shmget error: ");
                exit(-1);
        }
        shm_addr = (char *)shmat(shmid, NULL, 0);
        if (shm_addr == (char *)-1) {
                perror("shmat error: ");
                exit(-1);
        }

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

⌨️ 快捷键说明

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