0

複数の子プロセスに与えられたパイプから char* データを読み取ろうとしています。
各子は、親プロセスが読み取る共有パイプに char* を書き込みます。
私たちがやろうとしているのは、xv6 で実行されている子プロセスに関する情報を解析することです。
単一のプロセスを解析する場合、問題はありませんが、「runcmd」への再帰呼び出しがあるパイプ プロセスを解析する場合、次の問題が発生します。
親の最後で次のコードを使用しました。

while(read(p[0],buff,sizeof(buff)) > 0){
  printf(1,"\nprocess from pipe in main: " );
  printf(1,buff);
  printf(1,"\n");
}

そして子供の最後で:

char * name = ecmd->argv[0];
char * data=(char*)malloc(strlen(name)*sizeof(char)+strlen(pidc2)*sizeof(char)+3);
strcpy(data,name);
char* delimiter="#";
strcpy(data+strlen(name),delimiter);
strcpy(data+strlen(name)+strlen(delimiter),pidc2);
strcpy(data+strlen(name)+strlen(delimiter)+strlen(pidc2),"\0");
write(pp[1],data,sizeof(char)*(strlen(data)));

このコードを「ls|cat」で実行すると、次のように出力されます。

ls#*some_pid*cat#*some_pid*

各子から読み取って印刷する代わりに

ls#*some_pid*
cat#*some_pid*

なぜ別々に送らないのですか?

4

1 に答える 1

0

それがまさにパイプの仕組みだからです。内部的には、オペレーティング システムはすべてのライターからのデータを 1 つのストリームに結合しています。上記のコメントが示すように、各ライターにある種のレコード セパレータ ('\0' または '\n') を挿入させ、読み取りプロセスでレコードを検索してセパレータで分割することができます。

特に xv6 については知りませんが、従来の UNIX ライクなシステムでは、指定された長さを下回るメッセージの書き込みはアトミックであることが保証されていました (つまり、2 つのプロセスが両方とも書き込みを行う場合)。 'foo ' の場合、リーダーには 'ffooo ' やその他の順列ではなく 'foo foo ' が表示されます)。

于 2015-03-27T10:50:12.520 に答える