关于server-client

发布于 2022-07-16 19:41:08 字数 5719 浏览 11 评论 4

最近开始学习IPC,关于server-client之间是如何相互控制的有点不明白。
以下面的为例子说明一下?
server_main.c:

void server(int readfd, int writefd)
{
        int             fd;
        ssize_t n;
        char    buff[MAXLINE+1];
                /* 4read pathname from IPC channel */
        if ( (n = read(readfd, buff, MAXLINE)) == 0)
                printf("end-of-file while reading pathname");
        buff[n] = '';         /* null terminate pathname */

        if ( (fd = open(buff, O_RDONLY)) < 0) {
                        /* 4error: must tell client */
                snprintf(buff + n, sizeof(buff) - n, ": can't open, %sn",
                                 strerror(errno));
                n = strlen(buff);
                write(writefd, buff, n);

        } else {
                        /* 4open succeeded: copy file to IPC channel */
                while ( (n = read(fd, buff, MAXLINE)) > 0)
                        write(writefd, buff, n);
                close(fd);
        }
}

int
main(int argc, char **argv)
{
        int             readfd, writefd;

                /* 4create two FIFOs; OK if they already exist */
        if ((mkfifo(FIFO1, FILE_MODE) < 0) && (errno != EEXIST))
                printf("can't create %s", FIFO1);
        if ((mkfifo(FIFO2, FILE_MODE) < 0) && (errno != EEXIST)) {
                unlink(FIFO1);
                printf("can't create %s", FIFO2);
        }

        readfd = open(FIFO1, O_RDONLY, 0);
        writefd = open(FIFO2, O_WRONLY, 0);

        server(readfd, writefd);
        exit(0);
}

client_main.c:

void client(int readfd, int writefd)
{
        size_t  len;
        ssize_t n;
        char    buff[MAXLINE];

                /* 4read pathname */
        fgets(buff, MAXLINE, stdin);
        len = strlen(buff);             /* fgets() guarantees null byte at end */
        if (buff[len-1] == 'n')
                len--;                          /* delete newline from fgets() */

                /* 4write pathname to IPC channel */
        write(writefd, buff, len);

                /* 4read from IPC, write to standard output */
        while ( (n = read(readfd, buff, MAXLINE)) > 0)
                write(STDOUT_FILENO, buff, n);
}

int
main(int argc, char **argv)
{
        int             readfd, writefd;

        writefd = open(FIFO1, O_WRONLY, 0);
        readfd = open(FIFO2, O_RDONLY, 0);

        client(readfd, writefd);

        close(readfd);
        close(writefd);

        unlink(FIFO1);
        unlink(FIFO2);
        exit(0);
}

书上的实现是:先把server_main放在后台运行,然后再调用client_main。最终的结果是对的。
但是我不明白:在server_main中没有采用循环的时候询问client是否write值到fifo,那server如何知道client什么时候write值到fifo呢?
^_^刚刚开始学,还请大家多多指教咱呢~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

り繁华旳梦境 2022-07-24 23:04:04

???怎么没人回答啊?
斑斑呢?

芯好空 2022-07-24 22:55:34

麻烦高手点拨一下~谢谢啦!

凉城已无爱 2022-07-24 01:04:20

恩,我知道是可以通过readfd读出的,但是我不知道server怎么知道client什么时候往FIFO中写东西的?而且server代码中只有1次判断FIFO中是否有内容的" if ( (n = read(readfd, buff, MAXLINE)) == 0)",我觉得应该把if换成while来不停的询问client是否往FIFO中写内容,但是我试了一下,用if执行也是对的,^_^所以偶有点不明白。server和client的同步问题

夜血缘 2022-07-20 01:06:41

FIFO是一种特殊的文件,和pipe类似,当有内容写入FIFO时,通过readfd可以将它读出(否则read函数将一直阻塞进程)。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文