gpt4 book ai didi

c - C中的基本共享内存程序

转载 作者:太空宇宙 更新时间:2023-11-04 06:09:36 24 4
gpt4 key购买 nike

我想使用共享内存用 C 编写一个基本的聊天应用程序。我在 Linux 工作。应用程序在于写客户端和服务器可以读取,如果服务器写客户端可以读取消息。

我试过这样做,但是我无法实现客户端和服务器之间的通信。代码如下:

服务器.c

int
main(int argc, char **argv)
{
char *msg;
static char buf[SIZE];
int n;

msg = getmem();
memset(msg, 0, SIZE);
initmutex();

while ( true )
{
if( (n = read(0, buf, sizeof buf)) > 0 )
{
enter();
sprintf(msg, "%.*s", n, buf);
printf("Servidor escribe: %s", msg);
leave();
}else{
enter();
if ( strcmp(buf, msg) )
{
printf("Servidor lee: %s", msg);
strcpy(buf, msg);
}
leave();
sleep(1);
}
}
return 0;
}

客户端.c

int
main(int argc, char **argv)
{
char *msg;
static char buf[SIZE-1];
int n;

msg = getmem();
initmutex();

while(true)
{
if ( (n = read(0, buf, sizeof buf)) > 0 )
{
enter();
sprintf(msg, "%.*s", n, buf);
printf("Cliente escribe: %s", msg);
leave();
}else{
enter();
if ( strcmp(buf, msg) )
{
printf("Cliente lee: %s", msg);
strcpy(buf, msg);
}
leave();
sleep(1);
}
}
printf("Cliente termina\n");
return 0;
}

共享内存模块如下:

#include "common.h"

void
fatal(char *s)
{
perror(s);
exit(1);
}

char *
getmem(void)
{
int fd;
char *mem;

if ( (fd = shm_open("/message", O_RDWR|O_CREAT, 0666)) == -1 )
fatal("sh_open");
ftruncate(fd, SIZE);
if ( !(mem = mmap(NULL, SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) )
fatal("mmap");
close(fd);
return mem;
}

static sem_t *sd;

void
initmutex(void)
{
if ( !(sd = sem_open("/mutex", O_RDWR|O_CREAT, 0666, 1)) )
fatal("sem_open");
}

void
enter(void)
{
sem_wait(sd);
}

void
leave(void)
{
sem_post(sd);
}

最佳答案

当您能够正常工作时,您已经重新发明了一个管道。套接字是更好的解决方案,它还将涵盖更常见的服务器和客户端不在同一台机器上运行的情况。

关于c - C中的基本共享内存程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2810352/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com