我编写了一个服务器,它打开一个命名管道(它会阻塞,所以它会等待客户端连接),然后定期向管道写入一些内容。客户端打开管道,从中读取并处理数据。但是,由于我无法控制的情况,客户端经常退出并在此后不久再次重新启动。
当服务器想要在没有读取器连接到管道的短时间内写一些东西时,这会导致问题:服务器收到一个 SIGPIPE 并退出。我可以忽略信号,但我不想丢失数据:理想情况下,服务器会等到客户端重新连接到管道后再写入数据。在此写入期间服务器阻塞是没有问题的。
使用write()我可以尝试 0 字节写入并检查EPIPE错误以检测是否有客户端连接。但是我怎样才能阻止直到客户端连接(除了稍微睡一觉,然后再次尝试写入)?
还是有另一种更好的方法来实现这一目标?
这是一个非常简单的问题.我正在尝试解决HackerRank问题,但不完全理解我如何写入*standard-input*以便在我的计算机上运行代码.
它要求给定一个数组,给定数组的长度(N),然后是数组本身全部在*standard-input*上.
Hackerranks使用*standard-input*来给出值,如果我可以在输入中存储值然后读取它们,那将是最简单的.
我的问题是如何写入*standard-input*?这将使我在计算机上而不是在云中工作变得更加容易.
假设您有一个具有 32 深度 FIFO 的设备,其中在转换完成后存储来自 ADC 的数据。每次 FIFO 中有 X 个样本时,您都可以触发中断并从中获取数据。
当中断触发时,设备上的中断寄存器中的一个位被设置并且中断线被断言。
所以我的问题是:轮询中断寄存器以获取数据与使用中断线的功能有什么不同吗?是否有任何时间问题或我应该注意的任何问题?
我使用mkfifo命令创建了一个新的FIFO .我有一个文本文件f.txt.我想把文本文件写入我的FIFO.怎么样?是否有unix命令?
我刚刚开始使用UNIX FIFO,我在尝试第一个FIFO程序时发现了一些东西.程序以这种方式工作:创建FIFO后,使用该fork()函数启动两个进程.子进程读取父亲通过FIFO传递给他的内容,并将其打印在屏幕上.交换的数据是指定为参数的字符串.问题是:在父节中,如果我忘记关闭FIFO的输入端(意味着我排除了close(fd)行),即使正确交换了进程之间的数据,程序也会挂起.否则,一切正常,程序终止而不挂.有人可以解释一下为什么吗?
谢谢你的耐心.这是主要功能的代码:
int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("An argument must be specified\n");
return -1;
}
int ret = mkfifo("./fifo.txt", 0644);
char buf;
if(ret < 0)
{
perror("Error creating FIFO");
return -1;
}
pid_t pid = fork();
if(pid < 0)
{
perror("Error creating child process");
return -1;
}
if(pid == 0) /* child */
{
int fd = open("./fifo.txt", O_RDONLY); /* opens the fifo in reading mode */
while(read(fd, &buf, 1) …Run Code Online (Sandbox Code Playgroud) 我想让两个进程通过Linux上的两个命名管道相互通信.每个进程都是一个Unix过滤器:它读取标准输入的数据并在其标准输出上写入数据.它们是循环链接的,第一个的输出是第二个的输入,反之亦然.
这是第一个过滤器(ac)的代码:
#include <stdio.h>
int main( void ){
FILE* ferr = fopen( "/dev/stderr", "w" );
double d;
fprintf(ferr,"A is going to write\n");
printf("%lf\n",1.);
fprintf(ferr,"A wrote %lf\n",1.);
while( 1 ){
fprintf(ferr,"A is going to read\n");
if( scanf("%lf",&d) == EOF ){
break;
}
fprintf(ferr,"A recieved : %lf\n",d);
d += 1;
fprintf(ferr,"A is going to write\n");
printf("%lf\n",d);
fprintf(ferr,"A wrote %lf\n",d);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是第二个过滤器的代码(bc):
#include <stdio.h>
int main( void ){
FILE* ferr = fopen( "/dev/stderr", "w" );
double d;
while( 1 ){ …Run Code Online (Sandbox Code Playgroud) 有一些像:
-e /path/to/file or die "file doesn't exist";
Run Code Online (Sandbox Code Playgroud)
有可能做这样的事情:
-p /path/to/pipe or die "not a valid pipe";
Run Code Online (Sandbox Code Playgroud) 我正在构建一个通过FIFO与其客户端进行通信的服务器.
到目前为止,我已经设法创建一个FIFO,一旦消息到达FIFO并从线程输出消息,就运行一个新线程.
问题是,只要客户端在管道中写入内容,服务器就会无休止地打印消息(我正在读取管道中的内容while(1)).
我的问题是:read操作是否也应该从管道中删除消息,因此不会再次读取?这不是First In,First Out的重点吗?这是我必须手动完成的吗?
这也是我的代码,如果有帮助:http://pastebin.com/Ag7vgrav
我在FIFO中写的内容只是:echo test > /home/ubuntu/work/my_fifo
我有这个代码:
mkfifo ("bPipe", 0660); /* Create named pipe */
int fd1 = open ("bPipe", O_WRONLY|O_NONBLOCK); /* Open named pipe for writing */
perror("FD1");
int fd = open ("bPipe", O_RDONLY|O_NONBLOCK); /* Open it for reading */
perror("FD");
char*mex="Hello world\n\0";
write (fd1,mex , getStringLenght(mex)+1);
char* result = readline(fd1);
printf("Rc %s : \n",result);
Run Code Online (Sandbox Code Playgroud)
我正在研究C中的FIFO,我试图创建两个FIFO,但在打开它之后我得到了这两个错误:
FD1:Device not configured
FD:Device not configured
Run Code Online (Sandbox Code Playgroud)
而且我不明白为什么.
PS"readLine"和"getStringLenght"是我的功能
我正在尝试建立一个能够显示先出先出概念的队列.我想要一个作为等待名单的数组.后来的病人将在晚些时候出院.在这个房间里有24名病人的限制,其余的将进入等待名单.每当房间空无一人时,等候室(最早)的第一批病人就会前往房间.这是我到目前为止提出的代码.任何帮助是极大的赞赏.
Dim arrayU() As Variant
Dim arrayX() As Variant
Dim arrayW() As Variant
Dim LrowU As Integer
Dim LrowX As Integer
Dim LrowW As Integer
'Dim i As Integer
Dim j As Integer
Dim bed_in_use As Integer
LrowU = Columns(21).Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
LrowX = Columns(24).Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
LrowW = Columns(23).Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
ReDim arrayU(1 To LrowU)
ReDim arrayX(1 To LrowX)
ReDim arrayW(1 To LrowW)
For i = 3 To LrowU
arrayU(i) = Cells(i, 21)
Next i
i …Run Code Online (Sandbox Code Playgroud)