2015-12-25 77 views
2

我有一个与fifos和write()read()函数有关的问题。我通过mkfifo()函数创建fifo,然后使用fork()生成两个进程:第一个通过write()打开并在fifo上写入;另一个打开并读取read()。 我的问题是,在标准输出写入write(),并且read()等待我在stdin上写入内容并按Enter键,就像scanf()一样,因此不使用fifo。我真的不知道该怎么做,我已经尝试过任何东西,至今没有在互联网上发现任何相关问题。 我使用的是gcc编译器和Xubuntu 15.10。write()和read()不能在stdio而不是fifo上工作

过程发生器

int main (void) { 

    int f = mkfifo("try", S_IRUSR | S_IWUSR); 
    if (f < 0) 
     printf("mkfifo went fine\n"); 
    else 
     printf("mkfifo went wrong\n"); 
    pid_t fo = fork(); 
    switch (fo) { 
    case -1: 
     printf("err\n"); 
    case 0: 
     execlp("prova_fifo2", "prova_fifo2", NULL); 
    default: 
     execlp("prova_fifo", "prova_fifo", NULL); 
    } 

    return (0); 
} 

作家(又名prova_fifo)

int main (void) { 

    int fd; 
    if (fd = open("try", O_WRONLY) == -1) 
     printf("Error opening FIFO\n"); 

    char buf[6]; 
    sprintf(buf, "hello"); 
    int writer = write(fd, buf, strlen(buf)); 
    printf("%d", writer); 
    return (0); 
} 

阅读器(也称为prova_fifo2)

int main (void) { 

    int fd; 
    if (fd = open("try", O_RDONLY) ==-1) 
    printf("Errore in apertura FIFO\n"); 

    char buf[6]; 
    read(fd,&buf, strlen(buf)); //tried removing the "&", didn't work 
    printf("READ: %s", buf); 
    return (0); 
} 

注意我包括所有必要的库,代码编译和运行。我唯一的问题是上面提到的问题。

+0

'读(FD,与BUF ,strlen(buf));'这个buff是没有意义的,aand strlen()可以做可怕的事情,如果它没有找到一个0.同样:read()*可以*读取超过实际大小的小缓冲区 – wildplasser

+0

以'if(f <0)'开头的代码块1)如果'f'小于0,则调用mkfifo()失败。在这种情况下,调用:'perror(mkfifo failed“); exit(EXIT_FAILURE);'。因为如果函数失败,没有理由继续执行代码,并且调用perror()会输出系统认为问题是: – user3629249

+0

当对'execlp()'的调用失败时,该调用将返回。所以每次调用'execlp()'后面应该跟一个类似的内容:'perror(“execlp failed”); exit(EXIT_FAILURE);' – user3629249

回答

1

这是一个operator precedence问题,表达fd=open("try", O_WRONLY)==-1相当于fd=(open("try", O_WRONLY)==-1)这绝对不是你想要的,因为这将在open(...)==-1结果分配给fd这将是错误的(即0这是标准文件描述符输入)如果可以找到该文件,并且1如果文件不能找到。您需要做的是(fd=open("try", O_WRONLY))==-1

+0

谢谢!这固定它!这太简单了! –

1

对于未初始化的char数组,您无法明智地调用strlen()。你应该这样做:

read(fd, buf, sizeof(buf)); 

改为。

注意read()不会零终止您的阵列,并printf()预计将收到这样的事情%s,所以你可能想整个事情改变为:

char buf[7] = {0}; 
if (read(fd, buf, sizeof(buf) - 1) > 0) { 
    printf("READ: %s\n", buf); 
} 
+0

谢谢,我发布的代码只是我正在开发的真正的“巨大”代码的一个样本。 –

相关问题