0

我正在用 C 语言做一个简单的项目,涉及fork()socketpairs。该程序分叉一个进程,然后创建一个套接字对以供进程相互通信。父进程一次从标准输入读取一行,直到 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 才能退出。我如何让套接字循环直到 EOF 打印修改后的行?

4

1 回答 1

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;
}
于 2016-10-12T05:57:26.147 回答