我需要在C中创建10个管道。 为了使它们工作,我需要创建10个大小为2的int数组?或者我可以只声明一个大小为20的数组,然后为管道指定每个管道应从何处开始的地址? 如果我必须创建10,有什么办法可以循环创建它们并获得某种结果?
for(i=0; i<10; i++){
vec0[2]; //create array vec0, vec1, vec2....
pipe(vec0);
}
数组甚至是执行此操作的最佳方法吗?
答案 0 :(得分:2)
您可以只使用如下所示的二维int
数组。
int fds[10][2];
for(i=0; i<10; i++){
pipe(fds[i]);
}
其中fds[i][0]
代表读取结束,fds[i][1]
代表写入结束。
如果您不想使用二维数组,则可以声明具有20个int
的数组,如下所示,并使用基于偏移的方法来传递和读取fd's
。
int fds[20];
for(i=0; i<10; i++){
pipe(fds+i*2);
}
然后fds[i*2]
代表读取结束,fds[i*2+1]
代表写入结束。
答案 1 :(得分:2)
我需要在C中创建10个管道。为了使其正常工作,我需要创建10个大小为2的int数组?
那将是一种选择,但不是唯一的选择。
还是我可以声明一个大小为20的数组,然后为管道指定每个管道应从何处开始的地址?
是的,您可以这样做。 pipe()
函数在任何情况下都只接收指向第一个int
的指针,并要求可以通过该指针寻址随后的一个指针。
如果我必须创建10个,有什么办法可以循环创建它们并获得某种结果?
是的,您可以在循环中声明两个{int
数组,将其传递给pipe()
,然后在下一次迭代之前将结果复制到更永久的存储中,但这将很浪费
首先要考虑的是如何存储管道端文件描述符。如果仅在循环期间需要它们,则可以继续重复使用同一数组,或使用每个循环迭代数组,这样就永远只有一个。
但是假设您只想在循环中创建管道,这样您就需要在循环结束后跟踪其所有文件描述符。在这种情况下,仅保存文件描述符的最自然的数据结构将是数组数组,也就是2D数组:
int pipefds[10][2];
如果您打算使用这种结构,那么您的循环可能看起来像这样:
int pipefds[10][2];
for (int i = 0; i < 10; i++) {
pipe(pipefds[i]);
}