首页 > 解决方案 > 用管道发送字符串并在C中使用信号?

问题描述

我必须在 Linux 上用 C 语言编写一个程序作为家庭作业。 (感谢在线讲座,我的老师没有给我们示例程序)

有一个家长和两个孩子。

第一个孩子必须使用管道将字符串发送给父级。然后父母必须使用管道将字符串发送给另一个孩子。最后,其他孩子必须向父母发出信号。

有人可以给我看一个非常简化的代码吗?- 我找不到简单的例子和​​描述。

标签: clinuxpipesignals

解决方案


所以你需要一个双向管道。管道是 ipc 的单向方法,但您可以使用两个管道轻松创建双向管道。现在要创建一个管道,您可以使用 pipe() 函数(https://linux.die.net/man/2/pipe获取文档)。我可以给你一些关于 pipe() 的信息,第一个参数是一个两个字段的 int 数组,如果管道返回一个不同于 -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;
}

推荐阅读