基于IPC的echo server

来源:互联网 发布:绣花软件哪个好 编辑:程序博客网 时间:2024/04/29 09:57

Linux下使用共享内存和信号量来实现一个echo server。对共享内存的操作使用信号量来控制,类似于生产者和消费者的问题。下面附上server端和client端的代码。

Server.c

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <sys/mman.h>

#include <sys/types.h>

#include <fcntl.h>

#include <unistd.h>

#include <sys/shm.h>

#include <sys/stat.h>

#include <semaphore.h>

#include <assert.h>

#define MYSHM "myshm"

#define SEM_S "sem_s"

#define SEM_C "sem_c"

#define BUF_SIZE 200

typedef struct mydata {

        int flag;

        char buf[BUF_SIZE];

}mydata;

int main(int argc, char *argv[])

{

        int shm_key;

        int shm_id;

        char name[50];

        mydata *pdata;

        char *ptr;

        sem_t *sem_s, *sem_c;

        strcpy(name, MYSHM);

        shm_key = ftok(name, 0);

        if (shm_key ==  -1)

        {

                perror("ftok error");

                return -1;

        }

        shm_id = shmget(shm_key, sizeof(mydata), IPC_CREAT);

        if (-1 == shm_id)

        {

                perror("shmget error.");

                return -1;

        }

        ptr = shmat(shm_id, NULL, 0);

        if ((char *)-1 == ptr)

        {

                perror("shmat error.");

                return -1;

        }

        sem_s = sem_open(SEM_S, O_CREAT, 0644, 1);

        if (sem_s == NULL)

                perror("sem_open error.");

        assert(sem_s != NULL);

        int r1 = sem_init(sem_s, 1, 0);

        assert(r1 == 0);

        sem_c = sem_open(SEM_C, O_CREAT, 0644, 1);

        assert(sem_c != NULL);

        int r2 = sem_init(sem_c, 1, 0);

        assert(r2 == 0);

        pdata = (mydata *)ptr;

        while (1)

        {

                //while (!pdata->flag);

                sem_wait(sem_c);

                pdata->flag = 0;

                sem_post(sem_s);

        }

        shmdt(ptr);

        return 0;

}

Client.c

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <sys/mman.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <sys/shm.h>

#include <semaphore.h>

#include <assert.h>

#define MYSHM "myshm"

#define SEM_S "sem_s"

#define SEM_C "sem_c"

#define BUF_SIZE 200

typedef struct mydata {

        int flag;

        char buf[BUF_SIZE];

}mydata;

int main(int argc, char *argv[])

{

        int shm_key;

        int shm_id;

        char name[50];

        mydata *pdata;

        char *ptr;

        sem_t *sem_s, *sem_c;

        strcpy(name, MYSHM);

        shm_key = ftok(name, 0);

        if (shm_key ==  -1)

        {

                perror("ftok error");

                return -1;

        }

        shm_id = shmget(shm_key, sizeof(mydata), IPC_CREAT);

        if (-1 == shm_id)

        {

                perror("shmget error.");

                return -1;

        }

        ptr = shmat(shm_id, NULL, 0);

        if ((char *)-1 == ptr)

        {

                perror("shmat error.");

                return -1;

        }

        sem_s = sem_open(SEM_S, O_CREAT, 0644, 1);

        assert(sem_s != NULL);

        int r1 = sem_init(sem_s, 1, 0);

        assert(r1 == 0);

        sem_c = sem_open(SEM_C, O_CREAT, 0644, 1);

        assert(sem_c != NULL);

        int r2 = sem_init(sem_c, 1, 0);

        assert(r2 == 0);

        pdata = (mydata *)ptr;

        while (1)

        {

                fgets(pdata->buf, BUF_SIZE, stdin);

                pdata->flag = 1;

                //while (pdata->flag);

                sem_post(sem_c);

                sem_wait(sem_s);

                printf("%s", pdata->buf);

        }

        shmdt(ptr);

        return 0;

}

Makefile

all:

        gcc -g -Wall ipc_echo_server.c -o ipc_echo_server -lpthread

        gcc -g -Wall ipc_echo_client.c -o ipc_echo_client -lpthread

clean:

        rm -f ipc_echo_server ipc_echo_client

原创粉丝点击