IPC-管道

IPC-管道


問題描述:a進程把字符串發給b進程,b進程把字符串轉換成大寫後回發給a進程

server.c

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>

#define SERVER_FIFO "./server.fifo"
struct MSG
{
    int clientpid;
    char data[512];
};

int readn(int fd, char *buf, size_t count)
{
    int sum = 0;
    int ret = -1;
    while(ret != 0)
    {
        ret = read(fd, buf+sum, count-sum);
        if(ret == -1)
        {
            perror("read");
            exit(EXIT_FAILURE);
        }
        sum += ret;
    }
    return sum;
}

int writen(int fd, char *buf, size_t count)
{
    int sum = 0;
    int ret = 0;
    while(sum != count)
    {
        ret = write(fd, buf+sum, count-sum);
        if(ret == -1)
        {
            perror("write");
            exit(EXIT_FAILURE);
        }
        sum += ret;
    }
    return sum;
}

int mkOpenFifo()
{
    if(-1 == mkfifo(SERVER_FIFO, 0666))
    {
        perror("mkfifo");
        exit(EXIT_FAILURE);
    }
    printf("mkfifo finish!\n");

    int serverfd = open(SERVER_FIFO, O_RDONLY);
    if(-1 == serverfd)
    {
        perror("open");
        exit(EXIT_FAILURE);
    }
    printf("mkOpenFifo finish!\n");
    return serverfd;
}

void convertUpper(char *buf)
{

    while(*buf)
    {
        if(*buf >= 'a' && *buf <= 'z')
            *buf -= 32;
        ++buf;
    }
}

int openClientFifo(char *clientFifo, int flags)
{
    int clientfd = open(clientFifo, flags);
    if(-1 == clientfd)
    {
        perror("open");
        exit(EXIT_FAILURE);
    }
    return clientfd;
}

int main(void)
{
    int serverfd = mkOpenFifo();
    struct MSG msg;
    while(1)
    {
        printf("begin------------------------------\n");
        memset(&msg, 0, sizeof(struct MSG));
        readn(serverfd, (char*)&msg, sizeof(struct MSG));
        printf("Receive from %d: %s\n", msg.clientpid, msg.data);

        convertUpper(msg.data);
        char clientFifo[32];
        sprintf(clientFifo, "client%d.fifo", msg.clientpid);
        int clientfd = openClientFifo(clientFifo, O_WRONLY);
        printf("send to %d: %s\n", msg.clientpid, msg.data);
        writen(clientfd, msg.data, strlen(msg.data)+1);
        close(clientfd);
        putchar(10);
    }
    close(serverfd);
    return 0;
}

client.c

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>

#define SERVER_FIFO "./server.fifo"
struct MSG
{
    int clientpid;
    char data[512];
};

int readn(int fd, char *buf, size_t count)
{
    int sum = 0;
    int ret = -1;
    while(ret != 0)
    {
        ret = read(fd, buf+sum, count-sum);
        if(ret == -1)
        {
            perror("read");
            exit(EXIT_FAILURE);
        }
        sum += ret;
    }
    return sum;
}

int writen(int fd, char *buf, size_t count)
{
    int sum = 0;
    int ret = 0;
    while(sum != count)
    {
        ret = write(fd, buf+sum, count-sum);
        if(ret == -1)
        {
            perror("write");
            exit(EXIT_FAILURE);
        }
        sum += ret;
    }
    return sum;
}

void mkClientFifo(char *clientFifo)
{
    if(-1 == mkfifo(clientFifo, 0666))
    {
        perror("mkfifo");
        exit(EXIT_FAILURE);
    }
    printf("mkfifo finish!\n");
}

int openFifo(char *fifoPath, int flags)
{
    int fd = open(fifoPath, flags);
    if(-1 == fd)
    {
        perror("open");
        exit(EXIT_FAILURE);
    }
    printf("openFifo finish!\n");
    return fd;
}

int main(void)
{
    int serverfd = openFifo(SERVER_FIFO, O_WRONLY);
    char clientFifo[32];
    memset(clientFifo, 0, sizeof(clientFifo));
    sprintf(clientFifo, "client%d.fifo", getpid());
    mkClientFifo(clientFifo);
    struct MSG msg;
    msg.clientpid = getpid();
    char upperStr[512];
    while(1)
    {
        printf("begin---------------------------------\n");
        memset(&msg.data, 0, sizeof(msg.data));
        printf("please input: ");
        fgets(msg.data, sizeof(msg.data), stdin);
//      int n = readn(STDIN_FILENO, msg.data, sizeof(msg.data)-1);

        printf("send to server: pid: %d\tmsg: %s\n", getpid(), msg.data);
        writen(serverfd, (char*)&msg, sizeof(struct MSG));
        int clientfd = openFifo(clientFifo, O_RDONLY);
        memset(upperStr, 0, sizeof(upperStr));
        readn(clientfd, upperStr, sizeof(upperStr));
        printf("receive from server: %s\n", upperStr);
        close(clientfd);
        putchar(10);
    }
    close(serverfd);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章