2

添付のコードは、2つの端末間の通信を可能にする必要があります。通信は、現在のディレクトリに作成された2つのFIFOを介して行われます。プログラムは2つのFIFOを開く必要があり、息子はSTDINから読み取り、FIFO1を装着し、父親は他のFIFOから読み取り、端末に印刷します。このようにして、プログラムへの呼び出しが./myprog fifo1 fifo2(最初の端末の場合)および./myprog fifo2 fifo1(2番目の端末の場合)であるため、通信が行われます。コードはうまく機能しません。子のwrite()がfifoで実行するのはうまく機能しないのではないかと思います。私がよく説明したことを願って、meeeeを助けてください:'(

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <poll.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>

int main(int argc,char* argv[])
{
    if(argc<3)
    {
        printf("Error: Too few arguments...\n");
        exit(-1);
    }

    char** buffer_in=(char**) malloc(sizeof(char*));
    char** buffer_out=(char**) malloc(sizeof(char*));
    size_t dim_buff=sizeof(char*);
    FILE* stream;
    FILE* input;
    int fifo_in, fifo_out, num_poll_c, num_poll_f, read_count, i,write_b;
    pid_t pid;
    ssize_t length;
    struct pollfd* fd_set_c=(struct pollfd*) malloc(sizeof(int));//for the child
    struct pollfd* fd_set_f=(struct pollfd*) malloc(sizeof(int));//for the father


    printf("Write character e press enter:\n");

    if((fifo_in=open(argv[1],O_RDWR|O_NONBLOCK))==-1)
        perror("error open");
    if((fifo_out=open(argv[2],O_RDWR|O_NONBLOCK))==-1)
        perror("error open");

    if((input=fdopen(STDIN_FILENO,"r"))==NULL)
        perror("error fdopen");


    if((pid=fork())==-1)
        perror("error fork");
    while(1)
    {   
        if(pid==0)  /*child*/   
        {   
            fd_set_c->fd=STDIN_FILENO;
            fd_set_c->events=POLLIN;
            if((num_poll_c=poll(fd_set_c, 1, -1))==-1)
                perror("error poll child");//poll on fifo_in
            if((length=getline(buffer_in,&dim_buff,input))==-1)
                perror("error getline");



                printf("The written word is::%s\n",*buffer_in);/*my control for see what in buffer_in is*/


            if((write_b=write(fifo_in,*buffer_in,dim_buff))==-1)
                perror("error write");

        }

        else    /*father*/
        {   
            fd_set_f->fd=fifo_out;
            fd_set_c->events=POLLIN;

            if((num_poll_f=poll(fd_set_f, 1, 5000))==-1)
                perror("error poll father");//poll on fifo_out      
            if((read_count=read(fifo_out,*buffer_out,SSIZE_MAX))==-1)
                perror("error read");//read on fifo_out
            for(i=0;i<=read_count;i++)
                printf("%s",buffer_out[i]);//print on stdout buffer_out


        }
    }
    return 0;   

}
4

2 に答える 2

2

プロセスとセマフォ間の通信にはパイプ(man 2パイプまたは共有メモリ:man shmget)を使用して、読み取り/書き込みを保護する必要があります。グーグルで「生産者/消費者」を探してください。

これを見てください:http://users.evtek.fi/~tk/rtp/sem-producer-consumer.c そしてこれ: http: //knol.google.com/k/producer-consumer-problem#

于 2010-06-20T11:59:20.787 に答える
0

あなたはここで混乱しています。

親は、read()書き込み可能なファイル記述子がまだ開いているため、FIFO からブロックされる可能性があります。また、開いている書き込み可能なファイル記述子は、親プロセス自体に属しています。そして、ブロックされているため、read()書き込みできません。

の後に FIFO の開始を配置しfork()ます。より厳密なモードで開きます: ワイルドカード O_RDWR ではなく、書き込み専用または読み取り専用のいずれかです。そうすれば、pipe() に一般的に適用されるロジックを反映できます。

さらに、stdio はバッファリングされるため、STDIN_FILENO に対する poll() は危険です。ファイル記述子には、読み取るものが何もない可能性があります。これは、以前にすべて読み取られたが、stdio バッファー内にあるためです。自分が何をしているのか本当にわかっている場合は、少なくともバッファリングを無効にしてみてくださいman setvbuf. しかし、それでも fork() が存在する場合は実行しません。バッファリングされたデータは、子によって 1 回、親によって 1 回、2 回読み取られる可能性があります。

于 2010-06-20T20:20:53.290 に答える