利用FIFO通信

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/stat.h>
 
#define MAXLINE 4096
#define BUFFSIZE 4096

#define FIFO1 "/tmp/fifo.1"
#define FIFO2 "/tmp/fifo.2"
 
void client(int, int), server(int, int);
 
int main(int argc, char *argv[]) {
    int readfd, writefd;
    pid_t childpid;

	if((mkfifo(FIFO1, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)<0)&&(errno!=EEXIST)) {
		fprintf(stderr, "can't create %s\n", FIFO1);
		exit(-1);
	}

	if((mkfifo(FIFO2, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)<0)&&(errno!=EEXIST)) {
		unlink(FIFO1);
		fprintf(stderr, "cant't create %s\n", FIFO2);
	}

    if((childpid=fork()) < 0) {
        perror("fork error");
        exit(-1);
    } else if(childpid == 0) {
		if((readfd=open(FIFO1, O_RDONLY, 0))<0) {
			fprintf(stderr, "open %s error.\n", FIFO1);
			exit(-1);
		}
		if((writefd=open(FIFO2, O_WRONLY, 0))<0) {
            fprintf(stderr, "open %s error.\n", FIFO2);
            exit(-1);
        }
        server(readfd, writefd);
        exit(0);
    }

	if((writefd=open(FIFO1, O_WRONLY, 0))<0) {
		fprintf(stderr, "open %s error.\n", FIFO1);
		exit(-1);
	}
	if((readfd=open(FIFO2, O_RDONLY, 0))<0) {
		fprintf(stderr, "open %s error.\n", FIFO2);
		exit(-1);
	}
 
    client(readfd, writefd);
 
    if((waitpid(childpid, NULL, 0)) == -1) {
        perror("waitpid error");
        exit(-1);
    }

	if(close(readfd)==-1) {
		fprintf(stderr, "close readfd error.\n");
		exit(-1);
	}
	if(close(writefd)==-1) {
        fprintf(stderr, "close writefd error.\n");
        exit(-1);
    }

	if(unlink(FIFO1)<0) {
		fprintf(stderr, "delete %s error.\n", FIFO1);
		exit(-1);
	}
	if(unlink(FIFO2)<0) {
        fprintf(stderr, "delete %s error.\n", FIFO2);
        exit(-1);
    }

    exit(0);
}
 
void client(int readfd, int writefd) {
    size_t len;
    ssize_t n;
    char buff[MAXLINE];
 
    printf("-------hello-----starting client------------\n");
 
    if((fgets(buff, MAXLINE, stdin) == NULL) && ferror(stdin)) {
        perror("fgets error");
        exit(-1);
    }
 
    printf("client ipc pathname: %s\n", buff);
 
    len = strlen(buff);
    if(buff[len-1] == '\n')
        len--;
 
    if(write(writefd, buff, len) != len) {
        perror("write error");
        exit(-1);
    }
 
    while((n=read(readfd, buff, MAXLINE)) > 0) {
        printf("-----------------print to film----------------\n");
        if (write(STDOUT_FILENO, buff, n) != n ) {
            perror("write error");
            exit(-1);
        }
    }
}
 
void server(int readfd, int writefd) {
    int fd;
    ssize_t n;
    char buff[MAXLINE+1];
 
    printf("----------------start server-------------------\n");
 
    if((n=read(readfd, buff, MAXLINE)) == -1) {
        perror("read error");
        exit(-1);
    }
    if(n == 0) {
        perror("end-of-file while reading pathname");
        exit(-1);
    }
    buff[n]='\0';
 
    printf("server IPC pathname: %s\n",buff);
 
    if((fd=open(buff, O_RDONLY)) < 0) {
        snprintf(buff+n, sizeof(buff)-n, ": can't open, %s\n", strerror(errno));
        n=strlen(buff);
        if(write(writefd, buff, n) != n) {
            perror("write error");
            exit(-1);
        }
    }
    else {
        printf("------server open file success-------\n");
        while((n=read(fd, buff, MAXLINE)) > 0) {
            if(write(writefd, buff, n) != n) {
                perror("write error");
                exit(-1);
            }
        }
        close(fd);
    }
}

 

posted @ 2022-10-04 00:25  东宫得臣  阅读(31)  评论(0编辑  收藏  举报