- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在 3 个或更多 child 之间制作功能性管道?
我使用这个命令:
./function n
,其中 n
是子代的数量。
父亲制造了 n
个管道和 n
个 child 。
之后, children 关闭他们不会使用的管道。
然后父亲在第一个管道中写入一些内容,第一个 child 读取它,并将其写入下一个管道。最后一个 child 应该将内容写入stdout
。
当我只使用 1 个 child 时,效果非常好。当我尝试使用 2 个子级时,最后一个从管道中读取:-1 个字符,当我尝试使用 3 个子级时,出现段冲突并且代码不起作用。
希望你能帮助我,这是代码。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
void use_pipes(int i);
void write_father(void);
int (*pp)[2];
int childrens;
int main(int argc, char* argv[]) {
childrens = atoi(argv[1]);
int p, i, j, aux;
printf("I'm the parent and i'm making %d childrens\n", childrens);
pp = malloc(sizeof (*pp) * childrens);
for (i = 0; i < childrens; i++) {
if (pipe(pp[i]) < 0) {
perror("Error in pipe()");
exit(1);
}
}//for
for (i = 0; i < childrens; i++) {
printf("I'm the parent pid: %d and I'm going to make the child nº: %d\n", getpid(), i);
p = fork();
switch (p) {
case -1:
printf("We couldn't make the child nº:%d\n", i);
exit(1);
case 0:
//printf("I'm nº: %d, and I start my code\n",i);
for (aux = 0; aux < childrens; aux++) {
if (aux == i) {
//printf("I'm the children nº: %d and I'm going to close the pipe[%d] of writing\n", i,i);
close(pp[i][1]);
} else if (aux == i + 1) {
//printf("I'm the children nº: %d and I'm going to close the pipe[%d] of reading\n", i,aux);
close(pp[aux][0]);
} else {
//printf("I'm the children nº: %d and I'm going to close the pipe[%d]\n", i,aux);
close(pp[aux][0]);
close(pp[aux][1]);
}
}//for
//printf("I finished to close my unused pipes\n");
use_pipes(i);
exit(0);
default:
break;
}//switch
}//for of fork
close(pp[0][0]);
for (j = 1; j < childrens; j++) {
close(pp[j][0]);
close(pp[j][1]);
}//for
write_father();
int status;
for (i = 0; i < childrens; i++) {
wait(&status);
}
}//main
void write_father() {
int wroten;
char buffer[50] = "Hello World";
int len = strlen(buffer);
wroten = write(pp[0][1], buffer, len);
printf("The parent wrote: %d characters\n", wroten);
}
void use_pipes(int n_children) {
int readed;
char buffer [50];
readed = read(pp[n_children][0], buffer, sizeof (buffer));
printf("Children %d readed from pipe[%d][0]: %d characters\n", n_children, n_children, readed);
if (n_children != childrens - 1) {
printf("Children %d write in the pipe[%d][1]: %d characters\n", n_children, n_children + 1, readed);
write(pp[n_children + 1][1], buffer, readed);
} else
write(1, buffer, readed);
}
编辑:我发布了对我有用的代码
最佳答案
您有几个问题。
int* pp[2]
并不意味着您认为的意思。这是一个由两个指向 int
的指针组成的数组,但您似乎想要的是一个指向由两个 int
组成的数组的指针。那将是int (*pp)[2]
。您的段错误可能与此有关。
更正了 pp
的类型后,接下来必须正确分配它;具体来说,全部集中在一个 block 中。这是实现这一目标的最简洁的方法(请注意,不涉及循环,并且所需的大小是根据指针目标的大小定义的):
pp = malloc(childrens * sizeof(*pp));
如果您希望父级提前创建所有管道,那么您确实需要使用循环。
父级应该每次关闭未使用的管端一次,但是每个子级 fork 时都将其关闭一次。将其移出循环。
虽然 C 允许这样做,但允许控制到达 main()
的右括号是很糟糕的形式。请使用 return
语句或调用 exit()
。
您假设 I/O 不会拆分数据,因此单个 write()
和 read()
调用就足够了。这可能对您有用,但实际上并不可靠。您应该在必要时循环 write()
和 read()
通过多次调用来传输全部字节数。使用这些函数的返回值可以帮助解决此问题。
前面的内容意味着您需要在进程之间进行通信,以读取任何一条消息中的字节数。您可以使用终止符(例如换行符或空字节)来做到这一点,或者首先发送一个(固定大小)整数来说明同一消息中后面有多少个字符。
关于c - 超过 2 个子节点之间的管道失败 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37974261/
我试图四处移动一些 div,但我似乎无法通过对象对象选择它们: http://jsfiddle.net/kL3c8/1/ 1 2
我在 WP 网站上使用 Ninja Forms。有 2 个不同的字段(文本框和提交按钮)是单独的 DIV,它们都是单个 DIV 的子项。 它们出现在连续的行上,但我似乎无法在同一行上找到它们。帮忙?
我专门针对第 n 个 child (2n),但是具有给定类的 sibling 的第一个、第三个等应用了 css。 http://jsfiddle.net/relitnosmoge/9HCnH/1/ .
我有一个页面可以引入数据库条目并显示它们,并且我已经为所有其他条目/列表提供了这种样式: hjl:nth-child(odd) { background: #F2F2F2;} 这是我的 HTML/PH
我正在显示每个字母具有相同背景(宽度 31px )的字母表。我需要一半的字母宽度为 30px。这由以下人员处理: div.alpha:nth-child(even) {width: 30px;} 但是
我需要从一些大的嵌套字典中获取一些值。出于懒惰,我决定编写一个递归调用自身的函数,直到找到最后一个 child ,或者叶子为空。 由于会弹出字典,并且每次调用都会生成一个新字典,我想知道这有多有效。
我有 2 个 css 类 leftColumn 和 rightColumn 排列在 React SPA 的行布局中。问题在于,当浏览器变窄时,rightColumn 会在 leftColumn“下方”
我有这个 fiddle ,我想在默认情况下仅显示第一张照片并隐藏其余照片,并通过每次鼠标滚动更改照片。 var i 由 mousescroll 确定,如果 i 5,我希望操作中断,因为没有第 n 个
我有一个父 div 和 2 个嵌套的子 div。当第二个子 div 不包含任何内容时,我想隐藏第一个子 div 和父 div。我想知道如何做到这一点? 我有 2 个子 div 的原因是因为我正在创建一
我有一个父 div 和 2 个嵌套的子 div。当第二个子 div 不包含任何内容时,我想隐藏第一个子 div 和父 div。我想知道如何做到这一点? 当 .portfolio-works-conta
我注意到在我的浏览器中,SSL 证书链始终至少有 2 个子 CA。总是这样吗?如果属实,有人知道为什么吗? 最佳答案 通常至少有一个中间 CA,因为它可以更轻松地管理子公司和管理滚动,但这不是必需的。
我在让交叉淡入淡出动画停止在最后一个子节点上时遇到了一些麻烦。我知道 animation-fill-mode: forwards ,但它似乎不起作用(我试过将它放在不同的地方,例如在最初的 .cros
我想水平对齐 3 个不同的子 div。这 3 个 div 包含 1 个图像(高度和宽度 px)。每个 div 都有一个悬停链接(但我希望我的 onmouseover 仅位于图像上方,而不是位于 div
我正忙于 Bigcommerce 网站的设计,发现列表项及其各自背景存在 css 语法问题。 列表项标题和列表项本身是从数据库生成的。这是我的代码的样子: .Left #SideCategoryLis
所以我有一个父 div(100% 宽度)和其中的 3 个子 div(也是 100% 宽度)。我如何将“默认显示的 div”设置为第二个子元素,以便左侧 div 向左离开屏幕,而右侧 div 向右离开屏
我正在尝试将 vector 拆分为 n 个部分。我检查了以下解决方案 How to split a vector into n "almost equal" parts 我根据这个评论得出了以下代码:
下面是我的div: Abc pqr function AppendDiv(10,11) { var eFrom = $('#' + 10); var toD
我试图让我的 html 页面与 JSF 一起工作,并且偶然发现了一个问题,即如何让 nth-child css 选择器与 jsf 一起工作 repeat标签?现在,对于 repeat 标签生成的每个元
这个问题在这里已经有了答案: How do you keep parents of floated elements from collapsing? [duplicate] (15 个答案) 关闭
试图整理我的 CSS,一团糟,我有许多 ID 分布在 div 和子 div 中,以便我能够在 CSS 中选择它们。 我想知道这样做的正确方法是什么? 我考虑过使用类,这似乎是一种更好的方法,但仍然在每
我是一名优秀的程序员,十分优秀!