该程序可以用来构造由n个进程组成的环,n的值从命令行中获取
- 此时共需要n个管道。需要注意的是,程序只需要一个长度为2(而不是2n)的数组来保存文件的描述符
- 由两个进程组成的环被创建好之后,父进程就会退出,而子进程再次进行分支
- 并在父进程中向管道中输入“1 1”,在子进程中获取并重新输入,以实现斐波那契数列。
问题描述
在进行执行时,发现输出只有一行,当执行到write函数时,程序会自动退出,没有返回异常,结果如图所示:
mrzhi@mrzhi-VirtualBox:~/Desktop/Linux-网络编程/Unix_systems_programming/Chapter7_$ ./test2_ring_filter 4
This is process 1 with ID 7817 and parent id 7432
[7818] : process 1 success to read from pipe : 1 1 errno = Success
222222222222222222222222--->3-----1 2(该行是测试数据)
可以发现代码会卡在write函数,思索一下午,也没能解决,这里先把问题记录一下。
/* 该程序可以用来构造由n个进程组成的环,n的值从命令行中获取
* 此时共需要n个管道。需要注意的是,程序只需要一个长度为2(而不是2n)的数组来保存文件的描述符
* 由两个进程组成的环被创建好之后,父进程就会退出,而子进程再次进行分支
* 并在父进程中向管道中输入“1 1”,在子进程中获取并重新输入,以实现斐波那契数列。
*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <fcntl.h>
#include <wait.h>
#include "restart.h"
int main(int argc, char *argv[]) {
pid_t childpid; // 指示进程应该产生另一个进程
int fd[2]; // 管道中返回的文件描述符
int i; // i表示this进程数(从1开始)、
int error; // 从dup2调用中返回值
int nprocs; // 环中的进程总数
int ret;
char buf[256] = "1 1\0";
// 检查生产有效进程数的命令行
if ( argc != 2 || ( (nprocs = atoi(argv[1]) ) <= 0) ) {
fprintf(stderr, "Usage: %s nprocs\n", argv[0]);
return 1;
}
// 通过管道将std输入连接到std输出中
if (pipe(fd