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