c - 用管道发送字符串并在C中使用信号?
问题描述
我必须在 Linux 上用 C 语言编写一个程序作为家庭作业。 (感谢在线讲座,我的老师没有给我们示例程序)
有一个家长和两个孩子。
第一个孩子必须使用管道将字符串发送给父级。然后父母必须使用管道将字符串发送给另一个孩子。最后,其他孩子必须向父母发出信号。
有人可以给我看一个非常简化的代码吗?- 我找不到简单的例子和描述。
解决方案
所以你需要一个双向管道。管道是 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;
}
推荐阅读
- swift - 如何结合 Sprite-Kit 和 Gameplay-Kit 进行寻路?
- javascript - 与动态属性绑定时,VueJS v-model 在选择标签上不起作用
- python - 如何更准确地标记具有多种语言的单词数据列。?
- java - onbindviewholder 回收器视图的整数值
- react-native - React Native 中的 Csrf 令牌发布
- excel - 在另一个术语再次出现之后在 VBA 中查找第一次出现的术语
- renjin - 语法错误,意外的符号,在将列表转换为 R 中的 data.frame 时需要“,”
- angular - 填充嵌套数据的最佳方法
- r - 在 R 中使用 for 循环更新向量的问题
- android - 领域:没有索引的 updateOrInsert