Socketpair только печатает первую строку из stdin

Я делаю простой проект в C с участием fork() а также socketpairs, Программа разветвляет процесс, затем создает пару сокетов для процессов, чтобы общаться друг с другом. Родительский процесс читает строки из stdin по одной до EOF, а затем отправляет строки одну за другой дочерний. Дочерний конвертирует строки в верхний регистр и отправляет их обратно родителю, который отправляет их в стандартный вывод. Вот мой код

#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, чтобы выйти. Как заставить циклы проходить до тех пор, пока не завершится печать измененных строк?

1 ответ

Решение

Моя программа печатает первую строку с заглавной буквы stdin, но затем она зависает. Я должен Ctrl-C, чтобы выйти. Как заставить циклы проходить до тех пор, пока не завершится печать измененных строк?

Подпрограмма вашего дочернего процесса (то есть та, которая вызывает toupper()) вызывает read() только один раз, затем вызывает write() один раз и затем завершается. Вот почему обрабатывается только одна строка. Чтобы заставить его выполнять несколько строк, вам нужно поместить код в цикл:

[...]
  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;
}
Другие вопросы по тегам