先放下代码 回来在解释
头文件:
clientinfo.h
1 struct CLIENTINFO{ 2 char myfifo[ 500 ]; 3 int leftarg; 4 int rightarg; 5 char op; 6 }; 7 typedef struct CLIENTINFO CLIENTINFO, *CLINTINFOPTR;
client.c
1 #include <unistd.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include < string .h> 5 #include <sys/types.h> 6 #include <fcntl.h> 7 #include <signal.h> 8 #include " clientinfo.h " 9 10 #define FIFO_NAME "/home/levi/chatapplication/data/server_fifo/chat_server_fifo" 11 #define BUFF_SZ 100 12 13 char mypipename[BUFF_SZ]; 14 void handler( int sig){ 15 unlink(mypipename); 16 exit( 1 ); 17 } 18 19 int main( int argc, char const * argv[]) 20 { 21 int res; 22 int fifo_fd, my_fifo; 23 int fd; 24 CLIENTINFO info; 25 char buffer[BUFF_SZ]; 26 27 signal(SIGKILL, handler); 28 signal(SIGINT, handler); 29 signal(SIGTERM, handler); 30 31 if (argc != 4 ){ 32 printf( " Usage: %s op1 operation op2\n " , argv[ 0 ]); 33 exit( 1 ); 34 } 35 if (access(FIFO_NAME, F_OK) == - 1 ){ 36 printf( " Could not open FIFO %s\n " , FIFO_NAME); 37 exit(EXIT_FAILURE); 38 } 39 fifo_fd = open(FIFO_NAME, O_WRONLY); 40 if (fifo_fd == - 1 ){ 41 printf( " Could not open %s for write access\n " , FIFO_NAME); 42 exit(EXIT_FAILURE); 43 } 44 sprintf(mypipename, " /home/levi/chat_client_%d_fifo " , getpid()); 45 res = mkfifo(mypipename, 0777 ); 46 if (res != 0 ){ 47 printf( " FIFO %s was not created\n " , buffer); 48 exit(EXIT_FAILURE); 49 } 50 51 my_fifo = open(mypipename, O_RDONLY | O_NONBLOCK); 52 if (my_fifo == - 1 ){ 53 printf( " Could not open %s for read only access\n " , FIFO_NAME); 54 exit(EXIT_FAILURE); 55 } 56 57 strcpy(info.myfifo, mypipename); 58 info.leftarg = atoi(argv[ 1 ]); 59 info.op = argv[ 2 ][ 0 ]; 60 info.rightarg = atoi(argv[ 3 ]); 61 62 write(fifo_fd, &info, sizeof (CLIENTINFO)); 63 close(fifo_fd); 64 65 memset(buffer, ' \0 ' , BUFF_SZ); 66 while ( 1 ){ 67 res = read(my_fifo, buffer, BUFF_SZ); 68 if (res > 0 ){ 69 printf( " Received from server : %s\n " , buffer); 70 break ; 71 } 72 } 73 printf( " Client %d is terminating\n " , getpid()); 74 close(my_fifo); 75 ( void )unlink(mypipename); 76 return 0 ; 77 }
server.c
1 #include <unistd.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include < string .h> 5 #include <sys/types.h> 6 #include <fcntl.h> 7 #include <signal.h> 8 #include " clientinfo.h " 9 10 #define FIFO_NAME "/home/levi/server_fifo/chat_server_fifo" 11 void handler( int sig){ 12 unlink(FIFO_NAME); 13 exit( 1 ); 14 } 15 16 int calc(CLIENTINFOPTR info){ 17 switch (info-> op){ 18 case ' + ' : return info->leftarg + info-> rightarg; 19 case ' - ' : return info->leftarg - info-> rightarg; 20 case ' * ' : return info->leftarg * info-> rightarg; 21 case ' / ' : return info->leftarg / info-> rightarg; 22 } 23 return 0 ; 24 } 25 26 int main( int argc, char const * argv[]) 27 { 28 int res, i, fifo_fd, fd1; 29 CLIENTINFO info; 30 char buffer[ 100 ]; 31 signal(SIGKILL, handler); 32 signal(SIGINT, handler); 33 signal(SIGTERM, handler); 34 if (access(FIFO_NAME, F_OK) == - 1 ){ 35 res = mkfifo(FIFO_NAME, 0777 ); 36 if (res != 0 ){ 37 printf( " FIFO %s was not created\n " , FIFO_NAME); 38 exit(EXIT_FAILURE); 39 } 40 } 41 fifo_fd = open(FIFO_NAME, O_RDONLY); 42 if (fifo_fd == - 1 ){ 43 printf( " Could not open %s for read only access\n " , FIFO_NAME); 44 exit(EXIT_FAILURE); 45 } 46 printf( " \nServer is rarin to go !\n " ); 47 while ( 1 ){ 48 res = read(fifo_fd, &info, sizeof (CLIENTINFO)); 49 if (res != 0 ){ 50 printf( " Client arrived!!\n " ); 51 sprintf(buffer, " The result is %d " , calc(& info)); 52 fd1 = open(info.myfifo, O_WRONLY | O_NONBLOCK); 53 write (fd1, buffer, strlen(buffer) + 1 ); 54 close(fd1); 55 } 56 57 } 58 return 0 ; 59 }
OK!
./server.c &
./client 3 + 5
看输出吧!