如何在c中更改管道大小(或让父项在不使用管道的情况下获取子项的值)

时间:2016-03-27 00:54:28

标签: c arrays process pipe fork

在我的多进程程序中,子进程同时更改数组的上下文并且父进程读取。为了让父进程读取由子进程更新的数组,我被告知使用pipe并且它有效!问题是我不能使用ARRAY_SIZE超过65600ish,我需要它是5000000.

显然,fcntl可以改变它。 在main,我这样做了:

if(pipe(fd) == -1)
    perror("pipe");
fcntl(fd[1],F_SETPIPE_SZ,5000000);

它说F_SETPIPE_SZ未声明。

如果我将它移到main之外,它会说:

error: expected declaration specifiers or ‘...’ before numeric constant

而不是处理这些,有没有其他方法让父母读取更新的数组? (这是一项任务,所以我认为他们不会过于刻苦地说实话,所以我相信必须有一种更简单的方法)

编辑我想知道如何通过不改变管道尺寸来实现这一目标。这是我的代码。这段代码确实打印了我想要的内容,但在此作业中需要Total time = 1459086139.792471 seconds.,主要思想是查看单个流程程序和多流程程序的执行时间之间的差异。单个过程程序需要37秒。所以,这个结果不对,对吗?我试图将//another attempt之后的部分移动到循环的外部,它不起作用,它也没有给出任何错误,什么都不做。

        for(j = 0; j<NUM_OF_SUBARRAYS; j++)
    {
    start = (SUBARRAY_SIZE*j);
    child_pid = fork(); 

    switch (child_pid)
        {
    case -1:        
        perror("fork"); 
        exit(1);
    case 0:     
        child_process_routine(start);
        exit(0);
    default:
        waitpid(-1, NULL, 0);
        //another attempt
        close(fd[1]);
        for (i = 0; i<ARRAY_SIZE; i++)
        {
        read(fd[0], &temp, sizeof(temp));
        printf("%c ",temp);
        }
        close(fd[0]);
        }
    }

0 个答案:

没有答案