Socketpair只打印stdin的第一行

时间:2016-10-12 03:38:29

标签: c sockets fork toupper

我在C中做了一个涉及fork()socketpairs的简单项目。程序分叉一个进程,然后为进程创建一个套接字对,以便彼此进行通信。父进程一次一个地读取stdin中的行直到EOF,然后逐个发送子行。子将行转换为大写并将它们发送回父级,父级将它们发送到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打印修改后的行?

1 个答案:

答案 0 :(得分:1)

  

我的程序打印出stdin大写的第一行,然后是它   挂起。我必须ctrl-c退出。我如何让套接字循环通过   直到EOF打印修改后的行?

您的子进程的例程(即执行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;
}