New file |
| | |
| | | #include <stdio.h> |
| | | #include <string.h> |
| | | #include <unistd.h> |
| | | #include <errno.h> |
| | | #include <fcntl.h> |
| | | #include <sys/types.h> |
| | | #include <sys/wait.h> |
| | | #include <sys/stat.h> |
| | | #include <libgen.h> |
| | | #include <stdlib.h> |
| | | |
| | | #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)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |