2012-05-03 12 views
0

FifoとCでのプログラムの開発に個人的に興味があるので、私はこの演習に固執しています。私は大きな間違いを犯しています。 Fifoは作成されていますが、内部にフローはありません.Fifoの保護/クローズ/オープンメカニズムに依存する必要があります。助けてください。Fifo [c] Training

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

int main(int argc, char** argv) 
{ 
    int c; 
    int fi; 
    int fo; 
    int stat; 
    int pid; 
    fprintf(stderr, "Fifo...\n"); 

    if (mkfifo("FifoA", 0666)==-1) { 
    exit(1); 
    } 

    if (mkfifo("FifoB", 0666)==-1) { 
    exit(1); 
    } 

pid = fork(); 

    switch (pid) { 
    case 0: 

    if((fo=open("FifoA",O_RDONLY))==-1) 
    { 
     perror("error FifoA"); 
     exit(1); 
    } 

    close(fi); 
    while (read(fo, &c, 1)>0) { 

     c = toupper(c); 
     fputc(c,stdout); 
} 
    break; 
    case -1: 
    fprintf(stderr, "Fork error\n"); 
    exit(1); 
    default: 

    if((fi=open("FifoB",O_WRONLY))==-1) 
    { 
     perror("error FifoB"); 
     exit(1); 
    } 
    close(fo); 
    while ((c = fgetc(stdin))!=EOF) { 
     write(fi, &c, 1); 
    } 
    close(fi); 
    wait(&stat); 
    break; 
    } 

    return 0; 
} 
+0

したがって、_child_は_writing_( 'O_WRONLY')のためにfifoを開き、それから_reads_をオープンしますか?そして、親は_reading_のために開き、それから_writes_を開きますか?それは正しく見えません。 – Useless

答えて

1

は子供でO_RDONLY、親でO_WRONLYで、あなたfork()後のFIFOを開きます。このようにして、fifoは両端が開いていることを知り、通信を開始することができます。覚えておいてください、FIFOは単方向です、O_RDWRは理にかなっていません。

最後の問題は、2つの異なる鼓動を作成し、お互いに話すことを期待することです。

if((fo=open("FifoA",O_RDONLY))==-1) 
//... 
if((fi=open("FifoB",O_WRONLY))==-1) 

は、FIFOは二つの側面を持っている

if((fo=open("FifoA",O_RDONLY))==-1) 
//... 
if((fi=open("FifoA",O_WRONLY))==-1) 

であるべき。 1つのプロセスがフォームの一方の面を書き込み、他方のプロセスが他方の面から読み込みます。唯一の目標が書き込みと読み取りのプログラムであれば、1つのFIFOしか必要ありません。

+0

ありがとうございましたが、まだstdoutには何もありません。 – MagnatSony

+0

@MagnatSonyあなたは親と子供を混同しました。 – Dave

+0

_while(read(fo、&c、1)> 0)は、おそらくあなたが期待したように完全には動作しません。 readはEOFを示す0以外の-1を返す。したがってwhileチェックは正しい。 2つのFifoが必要です。 – MagnatSony