带/ dev / urandom的FIFO

时间:2017-12-27 20:09:10

标签: c ubuntu fifo

我遇到了问题。试着写一个简单的程序,一次分叉

父进程从/ 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;
}

1 个答案:

答案 0 :(得分:0)

正如rodrigo指出的那样,您的说明mkfifoopen("FIFO"...)是向后的,如果您打算使用临时的fifo,您只需使用pipe(2)来电,而不是创建和删除一个fifo。