使用管道发送字符串并在 C 中使用信号?

Sendindg strings with pipes and using signal in C?

我必须在 Linux 上做一个 C 程序作为家庭作业。 (感谢在线授课,我的老师没有给我们示例程序)

有一个Parent和两个child人。

第一个 child 必须使用管道将字符串发送到 Parent。 然后 Parent 必须使用管道将字符串发送到另一个 child。 最后,其他 child 必须向 parent 发出信号。

谁能给我一个非常简化的代码? - 我找不到简单的例子和​​描述。

所以你需要一个双向管道。 管道是 ipc 的一种单向方法,但您可以使用两个管道轻松创建双向管道。 现在要创建一个管道,您可以使用 pipe() 函数(https://linux.die.net/man/2/pipe 用于文档)。 我可以给你一些关于 pipe() 的信息,第一个参数是一个两个字段的 int 数组,如果管道 return 的值不同于 -1 调用成功终止并且在这个数组的位置 0 你有一个文件描述符,您可以在其中使用 read 来读取管道的内容,在位置 1 处,您可以使用 write 来写入管道。 前段时间我写了一个双向管道练习,所以我可以给你这个代码作为例子,但当然要阅读文档并理解什么是管道等等。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>
#include <errno.h>
#include <sys/wait.h>


int
main(void){
  int parents_fields[2];
  int child_fields[2];

  int parent_char;
  int child_char;
  char char_to_write;

  setbuf(stdout,NULL);

  if(pipe(parents_fields) == -1){
    perror("pipe() : parent_fields");
    exit(EXIT_FAILURE);
  }

  if(pipe(child_fields) == -1){
    perror("pipe() : child_fields");
    exit(EXIT_FAILURE);
  }

  switch(fork()){
  case -1:  // In case of error
    perror("fork() failed, terminating the program");
    exit(EXIT_FAILURE);
  case 0:   // Child
    // Closing unused file descriptors
    if(close(parents_fields[1]) == -1){
      perror("Child: Error closing parents_fields[1], terminatin the program");
      exit(EXIT_FAILURE);
    }

    if(close(child_fields[0]) == -1){
      perror("Child: Error closing child_fields[0], terminatin the program");
      exit(EXIT_FAILURE);
    }

    if(read(parents_fields[0],&parent_char,1) == -1){
      perror("Child: Error reading the parent pipe, terminating the program");
      exit(EXIT_FAILURE);
    }

    printf("%c\n",parent_char);

    parent_char = toupper(parent_char);

    printf("%c\n",parent_char);

    if(write(child_fields[1],&parent_char,1) == -1){
      printf("Child: Error reading the child pipe, terminating the program , %d , %d",child_fields[1],errno);
      exit(EXIT_FAILURE);
    }

    _exit(EXIT_SUCCESS);

    break;

  default:  //parent
    scanf("%c",&char_to_write);
    // Closing unused file descriptors
    if(close(parents_fields[0] == -1)){
      perror("Parent: Closing parents_fields[0], terminating the program...");
      exit(EXIT_FAILURE);
    }

    if(close(child_fields[1]) == -1){
      printf("Parent: Error closing child_fields[1], terminatin the program, %d",child_fields[1]);
      exit(EXIT_FAILURE);
    }

    if(write(parents_fields[1],&char_to_write,1) == -1){
      perror("Parent: Error writing on parent pipe");
      exit(EXIT_FAILURE);
    }

    if(read(child_fields[0],&parent_char,1) == -1){
      perror("Child: Error reading the child pipe, terminating the program");
      exit(EXIT_FAILURE);
    }

    printf("%c\n",parent_char);

    _exit(EXIT_SUCCESS);

    break;
  }

  return 0;
}