我遇到了一个问题。尝试编写一个 fork 一次的简单程序
父进程从/dev/urandom 发送子字节,子进程将它们输出到屏幕(每行 15 个十六进制字节)。问题是:当我第一次打开已编译的程序时,输出如下所示:
B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 ... B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0
(不总是“B0”,但肯定是相同的一个字节) 当我再次运行相同的程序(未重新编译)时,输出似乎没问题……有什么想法吗?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
int main(int argc, char *argv[])
{
char bufforek[256];
printf("P1: READING /dev/urandom\n");
FILE *file_ptr = fopen("/dev/urandom", "r");
int file=open("FIFO",O_RDWR);
mkfifo("FIFO",0666);
char pomoc;
int hexa;
int i=1;
if(fork()==0)
{
char bufforek1[256];
while(read(file,bufforek1,sizeof(bufforek1)))
{
pomoc = *bufforek1;
// printf("%hhX ", pom);
hexa = (int)pomoc;
pomoc = *bufforek1;
printf("%hhX ", pomoc);
if(i==15)
{
printf("\n");
i=1;
}
else i++;
// write(pipe_table[1],bufforek,sizeof(bufforek));
}
return 0;
}
while ((fgets(bufforek, sizeof(bufforek), file_ptr))!=NULL) write(file, bufforek, sizeof(bufforek));
unlink("FIFO");
return 0;
}
最佳答案
正如 rodrigo 指出的那样,您的指令 mkfifo
和 open("FIFO"...)
是倒退的,如果您要使用临时 fifo,您可以简单地使用 pipe(2)
调用而不是创建和删除 fifo。
关于c - 带/dev/urandom 的 FIFO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47998055/