使用管道发送字符串并在 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;
}
我必须在 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;
}