0

fork()とを含む C で簡単なプロジェクトを行っていsocketpairsます。プログラムはプロセスをフォークし、プロセスが互いに通信するためのソケットペアを作成します。親プロセスは、stdin から一度に 1 行ずつ EOF まで読み取り、その行を 1 行ずつ子プロセスに送信します。子は行を大文字に変換し、親に送り返します。親はそれらを stdout に送ります。これが私のコードです

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>

int main(int argc, char *argv[]) {
  /* code */
  int returnCode, status, socket[2], j;
  char* buffer;
  size_t bufferSize = 100;
  size_t line;

  buffer = (char *)malloc(bufferSize * sizeof(char));
  socketpair(AF_UNIX, SOCK_STREAM, 0, socket);

  returnCode = fork();
  if(returnCode == -1){
    printf("Fork failed\n");
  }
  if(returnCode > 0){
    while(getline(&buffer, &bufferSize, stdin) != -1){
      write(socket[1], buffer, bufferSize);
      read(socket[1], buffer, bufferSize);
      printf("%s", buffer);
    }
  }
  else{
    read (socket[0], buffer, bufferSize);
    for(j = 0; j[buffer];j++){
      buffer[j] = toupper(buffer[j]);
    }
    write(socket[0], buffer, bufferSize);
  }
  return 0;
}

私のプログラムは stdin の最初の行を大文字で出力しますが、その後ハングします。終了するにはctrl-cが必要です。EOF が変更された行を出力するまでソケットをループさせるにはどうすればよいですか?

4

1 に答える 1

1

私のプログラムは stdin の最初の行を大文字で出力しますが、その後ハングします。終了するにはctrl-cが必要です。EOF が変更された行を出力するまでソケットをループさせるにはどうすればよいですか?

子プロセスのルーチン (つまり、toupper() 呼び出しを行うルーチン) は、read() を 1 回だけ呼び出し、次に write() を 1 回呼び出してから終了します。そのため、1 行だけが処理されます。複数の行を実行するには、コードをループに入れる必要があります。

[...]
  else{
    while(read(socket[0], buffer, bufferSize) > 0)
    {
       for(j = 0; j[buffer];j++){
         buffer[j] = toupper(buffer[j]);
       }
       write(socket[0], buffer, bufferSize);
    }
  }
  return 0;
}
于 2016-10-12T05:57:26.147 に答える