Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-命名管道/FIFO的Scanf未阻塞_C - Fatal编程技术网

C-命名管道/FIFO的Scanf未阻塞

C-命名管道/FIFO的Scanf未阻塞,c,C,通常,当一个程序调用scanf时,它会等到stdin中有可用的东西时才从中读取。我目前正在制作一个fifo用于输入,另一个fifo用于输出,另一个进程将使用它从后台进程写入读取。但是,后台进程似乎并不等待任何扫描,有人知道为什么吗 代码如下: 背景: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <string.h&

通常,当一个程序调用scanf时,它会等到stdin中有可用的东西时才从中读取。我目前正在制作一个fifo用于输入,另一个fifo用于输出,另一个进程将使用它从后台进程写入读取。但是,后台进程似乎并不等待任何扫描,有人知道为什么吗

代码如下:

背景:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
int main()
{
    int out, in, err;

    char *cFifo = "/tmp/out";
    char *cInFifo = "/tmp/in";

    mkfifo(cFifo, S_IRUSR|S_IWUSR);
    mkfifo(cInFifo, S_IRUSR|S_IWUSR);

    out = open(cFifo, O_RDWR|O_TRUNC|O_NONBLOCK);
    in = open(cInFifo, O_RDWR|O_TRUNC|O_NONBLOCK);

    dup2(out, STDOUT_FILENO);
    dup2(out, STDERR_FILENO);
    dup2(in, STDIN_FILENO);


    scanf("%*c");

    while(1)
    {
        scanf("%*c");
        printf("Hello\n");
        fflush(stdout);
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
int out,in,err;
char*cFifo=“/tmp/out”;
char*cInFifo=“/tmp/in”;
mkfifo(cFifo,S|u IRUSR | S|u IWUSR);
mkfifo(cInFifo,S|u IRUSR | S|u IWUSR);
out=打开(cFifo,O|RDWR | O|TRUNC | O|UNBLOCK);
in=打开(cInFifo,O|RDWR | O|TRUNC | O|非块);
dup2(输出,标准输出文件号);
dup2(输出,标准文件号);
dup2(in,标准文件号);
scanf(“%*c”);
而(1)
{
scanf(“%*c”);
printf(“Hello\n”);
fflush(stdout);
}
返回0;
}
前景:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
int main()
{

    int out, in;
    size_t i = 0;

    char bufOut[1024];
    char *cFifo = "/tmp/out";
    char *cFifoIn = "/tmp/in";

    out = open(cFifo, O_RDONLY);

    in = open(cFifoIn, O_WRONLY);


    while(1)
    {
        i =0;
        while(!i)
        {
            i = read(out, bufOut, 1024);
        }

        if(i)
            write(STDOUT_FILENO, bufOut, i);

    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
int out,in;
尺寸i=0;
char bufOut[1024];
char*cFifo=“/tmp/out”;
char*cFifoIn=“/tmp/in”;
out=打开(仅限cFifo、Ordu);
in=打开(仅限cFifoIn、O_-WRU);
而(1)
{
i=0;
而(!i)
{
i=读数(读出,bufOut,1024);
}
如果(i)
写入(标准文件号,bufOut,i);
}
返回0;
}
我已经尝试强制写入新的输入fifo,但结果是一样的


我已经检查了错误,所有内容都返回预期值,no-1或与每个函数相关的任何其他错误

一个好的开始可能是实际检查错误。几乎所有调用的函数都会在出错时返回特定值,然后检查
errno
变量以查看错误是什么。为所有函数读取。抱歉,我没有将其放在这里,但我已经检查了错误,并且所有内容都返回预期值,no-1或与每个函数相关的任何其他错误不应
(I)write(STDOUT\u FILENO,bufOut,I)
be
if(i>0)write(…
并使用
ssize\u t i=0;
ssize\u t read(int-fd,void*buf,size\u t count);
返回一个有符号类型。@IndesejavelCoisa“scanf not blocking”(意外)和“一切都返回预期值”是互斥的。如果
scanf
返回预期值,则它确实能够读取您要求的内容。在
in=open(..O_NONBLOCK)
之后,您期望得到什么?