Linux FIFO

系统 1334 0

head.h:

      
         1
      
      
        /*
      
      
         head 
      
      
        */
      
      
         2
      
       #include <unistd.h>


      
         3
      
       #include <stdio.h>


      
         4
      
       #include <stdlib.h>


      
         5
      
       #include <
      
        string
      
      .h>


      
         6
      
       #include <sys/types.h>


      
         7
      
       #include <fcntl.h>


      
         8
      
       #include <signal.h>


      
         9
      
       #include <sys/stat.h>


      
        10
      
      
        11
      
      
        #define
      
       SERVER_FIFO "/tmp/server_fifo"


      
        12
      
      
        #define
      
       LOGIN    0


      
        13
      
      
        #define
      
       SEND    1


      
        14
      
      
        15
      
       typedef 
      
        struct
      
      
        16
      
      
        {


      
      
        17
      
      
        int
      
      
         service_type;


      
      
        18
      
      
        char
      
       myfifo[
      
        50
      
      
        ];


      
      
        19
      
      
        20
      
      
            union {


      
      
        21
      
      
        struct
      
      
         {


      
      
        22
      
      
        char
      
       username[
      
        50
      
      
        ];


      
      
        23
      
      
                }user ;


      
      
        24
      
      
        struct
      
      
         {


      
      
        25
      
      
        char
      
       name_src[
      
        50
      
      
        ];


      
      
        26
      
      
        char
      
       name_dst[
      
        50
      
      
        ];


      
      
        27
      
      
        char
      
       msg[
      
        100
      
      
        ];


      
      
        28
      
      
                }msg;


      
      
        29
      
      
            } choose;


      
      
        30
      
      
        }Message;


      
      
        31
      
      
        32
      
       typedef 
      
        struct
      
      
         {


      
      
        33
      
      
        char
      
       name[
      
        50
      
      
        ];


      
      
        34
      
      
        char
      
       fifo[
      
        50
      
      
        ];


      
      
        35
      
       }User;
    

server.c

      
         1
      
       #include 
      
        "
      
      
        head.h
      
      
        "
      
      
         2
      
      
        #define
      
       BUF_SIZE 100


      
         3
      
      
         4
      
      
        int
      
      
         ser_fifo;


      
      
         5
      
      
        int
      
      
         i;


      
      
         6
      
      
        int
      
      
         fd;


      
      
         7
      
      
        int
      
      
         user_num ;


      
      
         8
      
      
        char
      
      
         buffer[BUF_SIZE];


      
      
         9
      
      
        Message message;


      
      
        10
      
       User users[
      
        10
      
      
        ];


      
      
        11
      
      
        12
      
      
        void
      
      
         init(){


      
      
        13
      
      
        if
      
      (access(SERVER_FIFO, F_OK) == -
      
        1
      
      
        ){


      
      
        14
      
      
        if
      
      (mkfifo(SERVER_FIFO, 
      
        0777
      
      ) == -
      
        1
      
      
        ){


      
      
        15
      
                   perror(
      
        "
      
      
        init-access-mkfifo
      
      
        "
      
      
        );


      
      
        16
      
                   exit(
      
        1
      
      
        );


      
      
        17
      
      
                }


      
      
        18
      
      
            }


      
      
        19
      
      
        20
      
      
        if
      
      ((ser_fifo = open(SERVER_FIFO, O_RDONLY | O_NONBLOCK)) == -
      
        1
      
      
        ){


      
      
        21
      
               perror(
      
        "
      
      
        init-open
      
      
        "
      
      
        );


      
      
        22
      
               exit(
      
        1
      
      
        );


      
      
        23
      
      
            }


      
      
        24
      
      
        }


      
      
        25
      
      
        26
      
      
        27
      
      
        void
      
      
         sendBuffer(){


      
      
        28
      
      
        29
      
      
        if
      
      ((fd = open(message.myfifo, O_WRONLY | O_NONBLOCK)) == -
      
        1
      
      
        ){


      
      
        30
      
               perror(
      
        "
      
      
        sendBuffer-open
      
      
        "
      
      
        );


      
      
        31
      
               exit(
      
        1
      
      
        );


      
      
        32
      
      
            }


      
      
        33
      
      
        if
      
      (write(fd, buffer, strlen(buffer)+
      
        1
      
      ) == -
      
        1
      
      
        ){


      
      
        34
      
               perror(
      
        "
      
      
        serndBuffer-write
      
      
        "
      
      
        );


      
      
        35
      
      
            }


      
      
        36
      
      
            close(fd);


      
      
        37
      
      
        }


      
      
        38
      
      
        39
      
      
        void
      
      
         login(){


      
      
        40
      
      
        for
      
       (i = 
      
        0
      
      ; i < user_num; ++
      
        i)


      
      
        41
      
      
            {


      
      
        42
      
      
        if
      
      (strcmp(message.choose.user.username, users[i].name) == 
      
        0
      
      
        ){


      
      
        43
      
                   strcpy(buffer,
      
        "
      
      
        1,the user has existed
      
      
        "
      
      
        );


      
      
        44
      
      
        break
      
      
        ;


      
      
        45
      
      
                }


      
      
        46
      
      
            }


      
      
        47
      
      
        48
      
      
        if
      
      (i ==
      
         user_num)


      
      
        49
      
               strcpy(buffer ,
      
        "
      
      
        0,login success
      
      
        "
      
      
        );


      
      
        50
      
      
            strcpy(users[user_num].name, message.choose.user.username);


      
      
        51
      
           strcpy(users[user_num++
      
        ].fifo, message.myfifo);


      
      
        52
      
      
        53
      
      
            sendBuffer();


      
      
        54
      
      
        }


      
      
        55
      
      
        56
      
      
        void
      
      
         send(){


      
      
        57
      
      
        for
      
       (i = 
      
        0
      
      ; i < user_num; ++
      
        i)


      
      
        58
      
      
            {


      
      
        59
      
      
        if
      
      (strcmp(message.choose.msg.name_dst, users[i].name) == 
      
        0
      
      
        )


      
      
        60
      
      
        break
      
      
        ;


      
      
        61
      
      
            }


      
      
        62
      
      
        if
      
      (i ==
      
         user_num)


      
      
        63
      
               strcpy(buffer, 
      
        "
      
      
        the user is not exist! i=user_num
      
      
        "
      
      
        );


      
      
        64
      
      
        else
      
      
        {


      
      
        65
      
      
        if
      
      ((fd = open(users[i].fifo, O_WRONLY | O_NONBLOCK)) == -
      
        1
      
      
        ){


      
      
        66
      
                   perror(
      
        "
      
      
        send-open
      
      
        "
      
      
        );


      
      
        67
      
                   exit(
      
        1
      
      
        );


      
      
        68
      
      
                }


      
      
        69
      
               sprintf(buffer, 
      
        "
      
      
        from %s: %s\n
      
      
        "
      
      
        , message.choose.msg.name_src,message.choose.msg.msg);


      
      
        70
      
      
        if
      
      (write(fd, buffer, BUF_SIZE) == -
      
        1
      
      
        ){


      
      
        71
      
                   perror(
      
        "
      
      
        send-write
      
      
        "
      
      
        );


      
      
        72
      
                   exit(
      
        1
      
      
        );


      
      
        73
      
      
                }


      
      
        74
      
      
                close(fd);


      
      
        75
      
               strcpy(buffer, 
      
        "
      
      
        send success !!
      
      
        "
      
      
        );


      
      
        76
      
      
            }


      
      
        77
      
      
            sendBuffer();


      
      
        78
      
      
        }


      
      
        79
      
      
        80
      
      
        void
      
       operation(
      
        int
      
      
         type){


      
      
        81
      
      
        if
      
      (type ==
      
         LOGIN) login();


      
      
        82
      
      
        else
      
      
        if
      
      (type ==
      
         SEND) send();


      
      
        83
      
      
        }


      
      
        84
      
      
        85
      
      
        int
      
       main(
      
        int
      
       argc, 
      
        char
      
      
        const
      
       *
      
        argv[])


      
      
        86
      
      
        {


      
      
        87
      
      
            init();


      
      
        88
      
      
        while
      
      (
      
        1
      
      
        ){


      
      
        89
      
      
        if
      
      ((read(ser_fifo, &message, 
      
        sizeof
      
      (Message) + 
      
        50
      
      ))>
      
        0
      
      
        ){


      
      
        90
      
      
                    operation(message.service_type);


      
      
        91
      
      
                }


      
      
        92
      
      
            }


      
      
        93
      
      
        return
      
      
        0
      
      
        ;


      
      
        94
      
       }
    

client.c:

      
          1
      
       #include 
      
        "
      
      
        head.h
      
      
        "
      
      
          2
      
      
        #define
      
       BUF_SIZE 100


      
          3
      
      
        char
      
       mypipename[
      
        100
      
      
        ];


      
      
          4
      
      
        char
      
       myname[
      
        50
      
      
        ];


      
      
          5
      
      
        char
      
      
         buffer[BUF_SIZE];


      
      
          6
      
      
        int
      
      
         ser_fifo;


      
      
          7
      
      
        int
      
      
         my_fifo;


      
      
          8
      
      
        Message message;


      
      
          9
      
      
         10
      
      
         11
      
      
        void
      
      
         init(){


      
      
         12
      
      
        if
      
      (access(SERVER_FIFO, F_OK) == -
      
        1
      
      
        ){


      
      
         13
      
               perror(
      
        "
      
      
        init-access
      
      
        "
      
      
        );


      
      
         14
      
               exit(
      
        1
      
      
        );


      
      
         15
      
      
            }


      
      
         16
      
      
         17
      
           ser_fifo =
      
         open(SERVER_FIFO, O_WRONLY);


      
      
         18
      
      
        if
      
      (ser_fifo == -
      
        1
      
      
        ){


      
      
         19
      
               perror(
      
        "
      
      
        init-open
      
      
        "
      
      
        );


      
      
         20
      
               exit(
      
        1
      
      
        );


      
      
         21
      
      
            }


      
      
         22
      
      
         23
      
           sprintf(mypipename, 
      
        "
      
      
        /tmp/client%d_fifo
      
      
        "
      
      
        , getpid());


      
      
         24
      
      
        //
      
      
            printf("%s",mypipename);
      
      
         25
      
      
        if
      
      (mkfifo(mypipename, 
      
        0777
      
      ) == -
      
        1
      
      
        ){


      
      
         26
      
               perror(
      
        "
      
      
        init-mkfifo
      
      
        "
      
      
        );


      
      
         27
      
               exit(
      
        1
      
      
        );


      
      
         28
      
      
            }


      
      
         29
      
      
         30
      
           my_fifo = open(mypipename, O_RDONLY |
      
         O_NONBLOCK);


      
      
         31
      
      
        if
      
      (my_fifo == -
      
        1
      
      
        ){


      
      
         32
      
               perror(
      
        "
      
      
        open my fifo
      
      
        "
      
      
        );


      
      
         33
      
               exit(
      
        1
      
      
        );


      
      
         34
      
      
            }


      
      
         35
      
      
         36
      
      
            strcpy(message.myfifo, mypipename);


      
      
         37
      
      
        }


      
      
         38
      
      
         39
      
      
        void
      
      
         sendMessage(){


      
      
         40
      
      
        if
      
      (write(ser_fifo, &message, 
      
        sizeof
      
      (Message)) == -
      
        1
      
      
        ){


      
      
         41
      
               perror(
      
        "
      
      
        sendMessage-write
      
      
        "
      
      
        );


      
      
         42
      
               exit(
      
        1
      
      
        );


      
      
         43
      
      
            }


      
      
         44
      
      
        }


      
      
         45
      
      
         46
      
      
        recMessage(){


      
      
         47
      
      
        int
      
      
         res;


      
      
         48
      
      
        if
      
      ((res = read(my_fifo, buffer, BUF_SIZE)) == -
      
        1
      
      
        ){


      
      
         49
      
               perror(
      
        "
      
      
        recMessage-read
      
      
        "
      
      
        );


      
      
         50
      
               exit(
      
        1
      
      
        );


      
      
         51
      
      
            }


      
      
         52
      
      
        return
      
      
         res;


      
      
         53
      
      
        }


      
      
         54
      
      
         55
      
      
        int
      
      
         login(){


      
      
         56
      
           message.service_type =
      
         LOGIN;


      
      
         57
      
           printf(
      
        "
      
      
        username: 
      
      
        "
      
      
        );


      
      
         58
      
           scanf(
      
        "
      
      
        %s
      
      
        "
      
      
        , message.choose.user.username);


      
      
         59
      
      
            sendMessage();


      
      
         60
      
      
        while
      
      (recMessage() == 
      
        0
      
      
        ) ;


      
      
         61
      
           printf(
      
        "
      
      
        %s\n
      
      
        "
      
      
        , buffer);


      
      
         62
      
      
        if
      
      (buffer[
      
        0
      
      ] == 
      
        '
      
      
        0
      
      
        '
      
      
        ){


      
      
         63
      
      
                strcpy(myname, message.choose.user.username);


      
      
         64
      
      
        return
      
      
        0
      
      
        ;


      
      
         65
      
      
            }


      
      
         66
      
      
        return
      
       -
      
        1
      
      
        ;


      
      
         67
      
      
        }


      
      
         68
      
      
         69
      
      
        void
      
      
         send(){


      
      
         70
      
           message.service_type =
      
         SEND;


      
      
         71
      
           printf(
      
        "
      
      
        message to : 
      
      
        "
      
      
        );


      
      
         72
      
           scanf(
      
        "
      
      
        %s
      
      
        "
      
      
        , message.choose.msg.name_dst);


      
      
         73
      
           printf(
      
        "
      
      
        The message is :\n
      
      
        "
      
      
        );


      
      
         74
      
      
            getchar();


      
      
         75
      
           fgets(message.choose.msg.msg, 
      
        100
      
      
        , stdin);


      
      
         76
      
      
            strcpy(message.choose.msg.name_src, myname);


      
      
         77
      
      
            sendMessage();


      
      
         78
      
      
        }


      
      
         79
      
      
         80
      
      
        int
      
       main(
      
        int
      
       argc, 
      
        char
      
      
        const
      
       *
      
        argv[])


      
      
         81
      
      
        {


      
      
         82
      
      
            init();


      
      
         83
      
      
        while
      
      (login()!= 
      
        0
      
      
        );


      
      
         84
      
      
        int
      
      
         pid;


      
      
         85
      
      
        if
      
      ((pid = fork()) == -
      
        1
      
      
        ){


      
      
         86
      
               perror(
      
        "
      
      
        main-fork
      
      
        "
      
      
        );


      
      
         87
      
               exit(
      
        1
      
      
        );


      
      
         88
      
      
            }


      
      
         89
      
      
         90
      
      
        if
      
      (pid == 
      
        0
      
      
        ){


      
      
         91
      
      
        while
      
      (
      
        1
      
      
        ){


      
      
         92
      
      
        if
      
      (recMessage() > 
      
        0
      
      
        )


      
      
         93
      
                       printf(
      
        "
      
      
        %s\n
      
      
        "
      
      
        , buffer);


      
      
         94
      
      
                }


      
      
         95
      
      
            }


      
      
         96
      
      
        else
      
      
        {


      
      
         97
      
      
        while
      
      (
      
        1
      
      
        ){


      
      
         98
      
                   sleep(
      
        1
      
      
        );


      
      
         99
      
      
                    send();


      
      
        100
      
      
                }


      
      
        101
      
      
            }


      
      
        102
      
      
        return
      
      
        0
      
      
        ;


      
      
        103
      
       }
    

 

Linux FIFO


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论