C 中具有共享内存和信号量的客户端服务器程序

标签 c client-server posix semaphore shared-memory

我不太了解共享内存的工作原理,我正在尝试编写一个服务器-客户端程序,其中服务器和客户端使用共享内存和信号量相互通信。

共享内存结构:

typedef struct shared_mem{
    int board[BOARD_SIZE * BOARD_SIZE];
    int goal;
    int client;
    int direction;
    sem_t sem_server;
}shared_mem;
shared_mem *msg;

服务器:

int shmid;
key_t key=ftok("2048_client.c", 42);
if(key == -1) {
        printf("ftok failed");
        return -1;
    }
shared_mem *shm;

    if ((shmid = shmget(key, sizeof(msg), IPC_CREAT|0600)) < 0) {
        perror("shmget");
        exit(1);
    }

if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
        perror("shmat");
        exit(1);
    }

msg=shm;

int direction = -1;
srand(time(NULL));

//SERVER SETS VALUES FOR SHARED MEMORY STRUCTURE

sem_wait(&msg->sem_server);

// setup the board
initialize();

// the board starts with 2 pieces
create_game_piece();
printf("pieces created");
create_game_piece();

msg->client=0;

int i;

for (i = 0; i < BOARD_SIZE * BOARD_SIZE; i++)
    msg->board[i] = board[i];

sem_post(&msg->sem_server);     

// game loop
while (1) {

    //CLIENT READS AND CHANGES VALUES

    //SERVER READS VALUES CHANGED BY CLIENT

    if (!move_board(direction))
        continue;

    sem_wait(&msg->sem_server);
    moves++;
    direction=msg->direction;

    if (check_win()) {
        print_board(-1);
        printf("congratulations! you've won in %d moves\r\n", moves);
        return 0;
    }

    create_game_piece();

    if (!has_moves_left()) {
        print_board(-1);
        printf("you lose! try again\r\n");
        //sleep(1);
        return 1;
    }
    sem_post(&msg->sem_server); 
}

客户:

int shmid;
key_t key=ftok("2048_client.c", 42);
if(key == -1) {
        printf("ftok failed");
        return -1;
    }
shared_mem *shm;
msg=(shared_mem *)malloc(sizeof(shared_mem));

    if ((shmid = shmget(key, sizeof(msg), IPC_CREAT|0600)) < 0) {
        perror("shmget");
        exit(1);
    }

  if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
        perror("shmat");
        exit(1);
    }

atexit(on_exit2);
system("stty raw");

srand(time(NULL));

while (1) {

    // CLIENT READS VALUES CHANGED BY SERVER AND CHANGES THEM

    sem_wait(&msg->sem_server); 
    print_board(direction);

    direction = keypress();
    msg->direction=direction;
    sem_post(&msg->sem_server); 
}

有人能告诉我如何协调客户端和服务器访问共享内存的方式,以便它根据代码中的注释工作吗?

最佳答案

SHM_UNLOCK 并没有按照您的想法行事。它试图锁定内存中的页面而不是阻止访问。您需要一个信号量来控制对共享内存的访问。请参阅 semctl、semget 等,并在客户端和服务器中使用它们以实现互斥访问。

关于C 中具有共享内存和信号量的客户端服务器程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23919739/

相关文章:

c - 访问越界内存时没有段错误

android - 使用 Android NDK 演示 printf 或 __android_log_print 漏洞

multithreading - 实现 token 缓存

c++ - 是否可以在 POSIX 系统上部分释放动态分配的内存?

c - 用于不同大小阵列的 UART DMA

c - 在 C 中后/前递减 char 变量时这里发生了什么

我可以通过两者之间的服务器实现客户端 - 客户端通信吗?

node.js - 在 Socket.io 中使用 HTTP 进行 TCP 通信时出现 TypeError : Cannot read property 'emit' of undefined

c - 是 memset(&ptr, 0, sizeof(ptr));与 ptr=NULL 相同;?

linux - lio_listio : How to wait until all requests complete?