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

📄 10-11.c

📁 提供了许多进程间通信的实例程序。用linux下的C语言实现。
💻 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>

#define PROJID 0xFF
int main(void)
{
	char filenm[] = "shared-file";
	char * mmap_addr;
	int fd, semid;
	key_t semkey;
	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;

	fd = open(filenm, O_RDWR | O_CREAT);
        if (fd == -1) {
		perror("open error: ");
		semctl(semid, 0, IPC_RMID);
		exit(-1);
	}
	mmap_addr = (char *)mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
	if (mmap_addr == (char *)-1) {
		perror("mmap error: ");
		close(fd);
		exit(-1);
	}

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

⌨️ 快捷键说明

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