#include #include #include #include #include #include #include #include #include #include #define FIFO_FILE1 ".fifo_chat1" #define FIFO_FILE2 ".fifo_chat2" int g_stop = 0; void sig_pipe(int signum) { if(SIGPIPE == signum) { printf("get pipe broken signal and let programe exit\n"); g_stop = 1; } } int main(int argc, char **argv) { int fdr_fifo; int fdw_fifo; int rv; fd_set rdset; char buf[1024]; int mode = 0; char *rd_fifo = NULL; char *wr_fifo = NULL; if( argc != 2 ) { printf("Usage: %s [0/1]\n", basename(argv[0])); printf("This chat program need run twice, 1st time run with [0] and 2nd time with [1]\n"); return -1; } mode = atoi(argv[1]); if( 0 == mode ) { rd_fifo = FIFO_FILE1; wr_fifo = FIFO_FILE2; } else { rd_fifo = FIFO_FILE2; wr_fifo = FIFO_FILE1; } if( access(FIFO_FILE1 , F_OK) ) { printf("FIFO file \"%s\" not exist and create it now\n", FIFO_FILE1); mkfifo(FIFO_FILE1, 0666); } if( access(FIFO_FILE2 , F_OK) ) { printf("FIFO file \"%s\" not exist and create it now\n", FIFO_FILE2); mkfifo(FIFO_FILE2, 0666); } signal(SIGPIPE, sig_pipe); if( 0 == mode ) { printf("start open '%s' for read and it will blocked untill write endpoint opened...\n", rd_fifo); if( (fdr_fifo=open(rd_fifo, O_RDONLY)) < 0 ) { printf("Open fifo[%s] for chat read endpoint failure: %s\n", rd_fifo, strerror(errno)); return -1; } printf("start open '%s' for write...\n", wr_fifo); if( (fdw_fifo=open(wr_fifo, O_WRONLY)) < 0 ) { printf("Open fifo[%s] for chat write endpoint failure: %s\n", wr_fifo, strerror(errno)); return -1; } } else { printf("start open '%s' for write and it will blocked untill read endpoint opened...\n", wr_fifo); if( (fdw_fifo=open(wr_fifo, O_WRONLY)) < 0 ) { printf("Open fifo[%s] for chat write endpoint failure: %s\n", wr_fifo, strerror(errno)); return -1; } printf("start open '%s' for read...\n", rd_fifo); if( (fdr_fifo=open(rd_fifo, O_RDONLY)) < 0 ) { printf("Open fifo[%s] for chat read endpoint failure: %s\n", rd_fifo, strerror(errno)); return -1; } } printf("start chating with another program now, please input message now: \n"); while( !g_stop ) { FD_ZERO(&rdset); FD_SET(STDIN_FILENO, &rdset); FD_SET(fdr_fifo, &rdset); rv = select(fdr_fifo+1, &rdset, NULL, NULL, NULL); if( rv <= 0 ) { printf("Select get timeout or error: %s\n", strerror(errno)); continue; } /* get data arrive from FIFO */ if( FD_ISSET(fdr_fifo, &rdset) ) { memset(buf, 0, sizeof(buf)); rv=read(fdr_fifo, buf, sizeof(buf)); if( rv < 0) { printf("read data from FIFO get errorr: %s\n", strerror(errno)); break; } else if( 0==rv ) { printf("Another side of FIFO get closed and program will exit now\n"); break; } printf("<-- %s", buf); } if( FD_ISSET(STDIN_FILENO, &rdset) ) { memset(buf, 0, sizeof(buf)); fgets(buf, sizeof(buf), stdin); write(fdw_fifo, buf, strlen(buf)); } } }