c - 带/dev/urandom 的 FIFO

标签 c ubuntu fifo

我遇到了一个问题。尝试编写一个 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 指出的那样,您的指令 mkfifoopen("FIFO"...) 是倒退的,如果您要使用临时 fifo,您可以简单地使用 pipe(2) 调用而不是创建和删除 fifo。

关于c - 带/dev/urandom 的 FIFO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47998055/

相关文章:

c - 为什么我的 Valgrind 不显示错误行,而是显示 macOS Seirra 中的其他路径

c - 使用 Control + C 的进程突然结束是陷阱还是中断?

gcc - Ubuntu 升级后链接到库的问题

linux - Expect - 远程命令直接输出到本地文件

c++ - 如何从 C++/Qt Linux 应用程序逐行读取 FIFO/命名管道?

c - 如何加载与 jq 一起使用的数学库?

C、stat() 2 出现问题,无法打开文件

ruby - 从命令行运行时,反引号在 ruby​​ 脚本中工作,但不是从 Crontab

swift - 从 Swift 读取 Unix 时间

c# - FIFO 队列导致 IIS 处理器达到 100% 的最大值