Je souhaite créer une application de conversation de base en C à l'aide de la mémoire partagée. Je travaille sous Linux. L'application consiste à écrire le client et le serveur peut lire, et si le serveur écrit le client peut lire le message.Programme de mémoire partagée de base en C
J'ai essayé de le faire, mais je n'arrive pas à établir la communication entre le client et le serveur. Le code est le suivant:
server.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;
}
client.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;
}
Le module de mémoire partagée est le folowing:
#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);
}
S'il vous plaît formater votre code correctement (ou le télécharger sur un pastebin comme [privatepaste] (https://c.privatepaste.com)). – ThiefMaster
Dites-nous également ce qui se passe lorsque vous essayez d'exécuter notre code. –