UNIX IPC -----FIFO 实现

来源:互联网 发布:苹果手机赌博软件 编辑:程序博客网 时间:2024/06/08 08:13
fifo.h

/*********************************************************************
 * Created:         Nov 13th 2013
 * Author:          freeking
 * Descripition     fifo 实现client发送一个路径/文件名,sever返回该文件
 *                  的内容。
 * ******************************************************************/
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>


#define MAXLINE 4096
#define FIFO1 "/tmp/fifo.1"
#define FIFO2 "/tmp/fifo.2"
#define FILE_MODE 0664

client.c

#include "fifo.h"
void client(int readfd, int writefd)
{
    size_t len;
    ssize_t n;
    char buff[MAXLINE];

    if (NULL == fgets(buff, MAXLINE, stdin))
    {
        perror("fgets");
    }

    len = strlen(buff);
    
    if (buff[len - 1] = '\0')
    len--;

    write(writefd, buff, len);
    memset(buff, 0, MAXLINE-1);
    
    while ((n = read(readfd, buff, MAXLINE)) > 0 )
    {
        //printf("~~~~%d : %s\n", __LINE__, buff);
        write(STDOUT_FILENO, buff, n);
    }    
}


int main(int argc, char ** argv)
{
    int readfd, writefd;

    writefd = open(FIFO1, O_WRONLY, 0);
    readfd = open(FIFO2, O_RDONLY, 0);

    client(readfd, writefd);

    close(readfd);
    close(writefd);

    unlink(FIFO1);
    unlink(FIFO2);

    return 0;
}

server:

#include "fifo.h"

void server(int readfd, int writefd)
{
    int fd;
    ssize_t n;
    char buff[MAXLINE] = {0};

    if (0 == (n = read(readfd, buff, MAXLINE)))
    {
        perror("end of file");
        return;
    }

    buff[n] = '\0';
    if ((fd = open(buff, O_RDONLY)) < 0)
    {
        snprintf(buff + n, sizeof(buff) - n, ":can't open , %s\n", strerror(errno));
        n = strlen(buff);
        write(writefd, buff, n);
    }
    else
    {
        memset(buff, 0, MAXLINE-1);
        while((n = read(fd, buff, MAXLINE)) > 0)
        {
            write(writefd, buff, n);
        }    
        close(fd);
    }
}

int main(int argc, char ** argv)
{
    int readfd, writefd;
    
    /* create two FIFOs; OK if they already exsit */
    if ((mkfifo(FIFO1, FILE_MODE) < 0) && errno != EEXIST)
    {
        perror("can't create FIFO1");
    }

    if ((mkfifo(FIFO2, FILE_MODE) < 0) && errno != EEXIST)
    {
        unlink(FIFO2);
        perror("can't create FIFO2");
    }
    
    readfd = open(FIFO1, O_RDONLY, 0);
    writefd = open(FIFO2, O_WRONLY, 0);

    server(readfd, writefd);
    return 0;
}

验证方式:

1:后台方式启动server

2:启动client,输入路径+文件名

原创粉丝点击