首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建替换stdin的文件描述符(在select()中)

创建替换stdin的文件描述符(在select()中)
EN

Stack Overflow用户
提问于 2017-03-15 11:37:38
回答 3查看 993关注 0票数 0

考虑到在没有键盘输入的情况下与多客户端Unix域套接字进行通信,我希望创建一个替代stdin的文件描述符。

使用多客户端套接字,您必须将stdin的文件描述符(使用FD_SET(0, &readfds))添加到再读中,以便将键盘输入(FD_ISSET(0, &readfds))发送到服务器。因为我不想每次启动客户端时都编写文件,所以我希望用自定义的描述符来替换这个文件描述符(通过从另一个程序写入这个文件)。

我签出了创建文件描述符来创建两个程序:

写入文件描述符的人:

代码语言:javascript
复制
int main() {
    char buffer[] = "test";
    int fd = open("sample.dat", O_WRONLY | O_CREAT, 0666);
    dup2(fd, 5);

    if(write(5, buffer, 4) < 0)
        fprintf(stderr, "write %s\n", strerror(errno));

    close(5);    
    return 0;
}

另一个从里面读到:

代码语言:javascript
复制
int main() {
    char buffer[4];
    int fd = open("sample.dat", O_RDONLY);
    dup2(fd, 5);

    for(;;) {
        if(read(5, buffer, 4) < 0)
            fprintf(stderr, "read %s\n", strerror(errno));

        printf("%s\n", buffer);
        sleep(1);
    }

    return 0;
}

,我的问题是:是否可以使这个文件描述符像stdin一样?我的意思是,实际上我的第二个程序无休止地阅读“测试”,因为(当然) sample.dat仍然包含“测试”,但是我想在它被读取之后删除它。

EN

回答 3

Stack Overflow用户

发布于 2017-03-15 12:01:21

是。您可以为此使用管道:https://linux.die.net/man/2/pipe

或者FIFO:使用FIFO的https://linux.die.net/man/3/mkfifo将在文件系统中创建一个文件,该文件可以由客户端和服务器进程打开以进行通信。

票数 0
EN

Stack Overflow用户

发布于 2017-03-15 12:31:27

如果我的理解是正确的,你想要与一个只能在stdin上阅读的程序进行交流。在stdin中有两种书写方式:第一种是使用键盘,第二种是使用write()

代码语言:javascript
复制
#include <unistd.h>
#include <string.h>

int         main(void)
{
    char    *s = "what you want to write";
    write(STDIN_FILENO, s, strlen(s));
    return (0);
}

这个程序会在stdin上写,就像用键盘写一样。此外,您还会看到命令行界面上打印的字符串.

票数 0
EN

Stack Overflow用户

发布于 2017-03-15 13:30:09

问题不在于您一直在“测试”中阅读,而是您没有正确地处理对read()的调用。当您检查它是否返回错误时,您没有看到读取了多少字节。read()不null--终止读取的字符串,因此您应该实际存储返回值,并使用返回值将NUL放入缓冲区。否则,由于缓冲区中的任何内容都没有改变,似乎您正在一遍又一遍地重读相同的文本。

代码语言:javascript
复制
    int err=read(fd, buffer, 4);
    if(err < 0)
        {
        fprintf(stderr, "read %s\n", strerror(errno));
        }
    else
        {
        buffer[err]='\0';
        }

如果你做了这个改变,你会发现你只读过一次“测试”,在那之后你就什么也不读了。

注意:您不需要调用dup2() --这只是为了将文件描述符复制到已知值。您可以像调用中那样使用fd来读取/写入数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42808661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档