#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <stdarg.h>
#include <fcntl.h>

void parent(char *argv[]);
void child(char *argv[]);
int write_buffer(int fd, const void *buf, int count);
int read_buffer(int fd, void *buf, int count);
int readnlstring(int socket, char *buf, int maxlen, char delim);

int main(int argc, char *argv[])
{
    if(argc<2)parent(argv);
    else child(argv); 

    return 0;
}

void parent(char *argv[])
{
    char buffer[100];
    int fd;

    close(0);
    if(mkfifo("my-fifo", 0600) == -1)
    {
        printf("error, failed to creat my-fifo!\r\n");
        exit(254);
    }
    printf("the server is listening on my-fifo.\r\n");
    if((fd=open("my-fifo", O_RDONLY)) == -1)
    {
        printf("error, failed to open my-fifo!\r\n");
        exit(254);
    }
    printf("the client has connected.\r\n");

    while(1)
    {
        int ret;
        if((ret=readnlstring(fd, buffer, sizeof(buffer), '\n'))>0)
        {
            *(buffer+ret) = 0x00;
            printf("received message: %s\r\n", buffer);
        }
        else
        {
            break;
        }
    }

    printf("No more data. parent exiting...\r\n");
    if(close(fd)==-1)
    {
        printf("error,close failed!\r\n");
        exit(254);
    }
    unlink("my-fifo");

}


void child(char *argv[])
{
    char buffer[100];
    int fd;
    
    if((fd=open("my-fifo", O_RDONLY)) == -1)
    {
        printf("error, failed to open my-fifo!\r\n");
        exit(254);
    }
    printf("the client is ready.Enter message,or Ctrl+D when done.\r\n");
    
    while(fgets(buffer, sizeof(buffer), stdin) != NULL)
    {
        write_buffer(fd, buffer, strlen(buffer));
    }

    printf("client exiting.\r\n");
    if(close(fd)==-1)
        printf("error,close failed!\r\n");

    exit(254);
}


int write_buffer(int fd, const void *buf, int count)
{
    const void *pts=buf;
    int status=0,n;

    if(count<0)return -1;
    while(status != count)
    {
        if((n=write(fd, pts+status, count-status)) == -1)
        {
            printf("error, failed to write!\r\n");
            exit(254);
        }
        else if(n<0)
        {
            return n;
        }
        status += n;
    }
    return status;
}

int read_buffer(int fd, void *buf, int count)
{
    void *pts=buf;
    int status=0,n;

    if(count<0)return -1;
    while(status != count)
    {
        if((n=read(fd, pts+status, count-status)) == -1)
        {
            printf("error, failed to read!\r\n");
            exit(254);
        }
        else if(n<0)
        {
            return n;
        }
        status += n;
    }
    return status;
}

int readnlstring(int socket, char *buf, int maxlen, char delim)
{
    int status;
    int count=0;
    while(count < maxlen-1)
    {
        if((status=read_buffer(socket, buf+count, 1)) < 1)
        {
            return -1;
        }
        if(buf[count] == delim)
        {
            buf[count]=0x00;
            return count;
        }
        count++;
    }
    buf[count]=0x00;
    return count;
}

 

 

posted on 2013-04-01 09:51  阿逸  阅读(191)  评论(2编辑  收藏  举报