0

私の質問は単純明快です。ここでは、パイプの一方の端でデータを送信し、もう一方の端から読み取ろうとしています。IPC メカニズムを学習しようとしていますが、この単純なプログラムを実行中に行き詰まりました。親プロセスで print()[1] を使用しています。

o/p is 

In the child process
IN the parent process and its sleeping
SUBI IS IN LOVE WITH PUTHALATH

しかし、親プロセスで write() [以下のプログラムでコメントされている 2] を使用している場合

 o/p is 

 In the child process
 IN the parent process and its sleeping
 SUBI IS IN LOVE WITH PUTHALATHIN the parent process and its sleeping

「親プロセスとそのスリープ中」という行が2回印刷されたのはなぜですか?

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>

int main(){

   int fd[2];
   pipe(fd);

  if(!fork()){
    printf("In the child process\n");
    close(1);
    dup(fd[1]);
    close(fd[0]);
    write(1,"SUBI IS IN LOVE WITH PUTHALATH", 200);

   } else {
      sleep(1);
      printf("IN the parent process and its sleeping \n");
      char* stream;
      close(fd[1]);
       read(fd[0],stream,200);
       printf("%s",stream);------>(1)
      // write(1,stream,200);---->(2)
    }
     return 0;
    }

私はここで立ち往生しているので、助けてください。

4

3 に答える 3

0

これをコンパイルしようとすると、gcc は次のように言います。

22:12: warning: ‘stream’ may be used uninitialized in this function
[-Wuninitialized]

これは主要な兆候です!

に変更char *streamするchar stream[200];と、期待どおりに動作します。しかしwrite、最後にそれを呼び出すと、文字列を超えて、その後にたまたまメモリにあるものを書き込むことになり、0に初期化されていないため、おそらくランダムなゴミになります. これで修正できます:

write(1, stream, strlen(stream)); //correct length, not all 200 bytes

ただし、実際には、割り当てていないメモリから書き込みを行っているため、親に 200 バイトを書き込むべきではありません。この数値は、文字列の長さに等しい必要があります (+ の場合は 1 \0)。

于 2013-03-12T19:25:17.417 に答える
0

バグ

   It is not advisable to mix calls to output functions from the stdio library
   with low-level calls to write(2) for the file descriptor associated with
   the same output stream; the results will be undefined and very probably not
   what you want.

http://man7.org/linux/man-pages/man3/puts.3.html

他の人が指摘したように、ストリームにメモリを割り当てませんでした..

于 2013-03-12T19:06:51.053 に答える
0

子供の中で、あなたは

write(1,"SUBI IS IN LOVE WITH PUTHALATH", 200);

文字列リテラルの開始位置から 200 バイトをパイプに書き込みます。

あなたが

write(1,stream,200);

親では (にメモリを割り当てた後stream)、子によってパイプに書き込まれた 200 バイトを書き込みますが、printfは文字列リテラルを終了する 0 バイトで停止します"SUBI IS IN LOVE WITH PUTHALATH"

そのため、メモリ内のその文字列リテラルに続くバイトも出力されます。文字列リテラル"IN the parent process and its sleeping \n"は明らかにそのメモリ セクション内にあります。

于 2013-03-12T19:14:45.453 に答える