C fork 和 pipe 从文件中添加数字

Posted

技术标签:

【中文标题】C fork 和 pipe 从文件中添加数字【英文标题】:C fork and pipe add numbers from a file 【发布时间】:2016-10-23 20:26:10 【问题描述】:

执行时同一文件的总数不同。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_FILE_NAME 100
#define RUNS 1

int main()     
    int num,i;
    FILE *fp;
    char*s, buf[1024];
    int count =0;
    char c;
    char filename[MAX_FILE_NAME];
    printf("Enter filename: ");
    scanf ("%s",filename);
    if ((fp =fopen(filename, "r"))  == NULL)    
        printf("Error");
        exit(1);
    
    fscanf(fp,"%d",&num);
    for (c = getc(fp); c!= EOF; c = getc(fp))
    
        if (c == '\n')
            count = count+1;
        
    
    printf("%s has %d numbers \n", filename, count);
    int f;
    printf("Choose from the options how many processes you want to use [1,2,4]: ");
    scanf("%i", &f);
    printf("%i processes \n", f);
    int fds[f+1][2];
    int numb[count];
    int x,k;
    time_t start, finish;
    start = time(NULL);

    for(i = 0; i < RUNS; i++)
    
        pipe(fds[f]);
        for( x = 0; x<f; x++)
        
            pipe(fds[x]);
            int ind[2];
            ind[0] = ((x)*(count/f));
            ind[1] = ((x+1)*(count/f));
            write(fds[x][1], &ind, 2* sizeof(int));
            if (fork() ==0)
            
                int t =0;
                int ind2[2];
                read(fds[x][0], &ind2, 2*sizeof(int));
                for( k = ind2[0]; k<ind2[1]; k++)
                
                    t += numb[k];
                
                write(fds[f][1], &t, sizeof(int));
                exit(0);
            
        
        int m, tmp, total;
        total = 0;
        for( m = 0; m < f; m++)
        

        for( m = 0; m < f; m++)
        
            read(fds[f][0], &tmp, sizeof(int));
            sleep(5);
            total += tmp;
        
        printf("DOne calc \n");
        printf("Total: %i \n", total);
    
    finish = time(NULL);
    float runtime = (float)((finish-start)/RUNS);
    printf("runtime: %f \n", runtime);
    fclose(fp);
    return 0; 

【问题讨论】:

你有两次for( m = 0; m &lt; f; m++),所以你有不匹配的大括号。 那不是 C#。 欢迎来到 Stack Overflow。请尽快阅读About 和How to Ask 页面。另请更紧急地阅读有关如何创建 MCVE (minimal reproducible example) 的信息。您已经满足了 MCVE 标准的一部分——一些代码。没有解释用作输入的数据文件,也没有说明您期望的输出内容,也没有说明您得到的输出内容,并且其中没有任何正式问题的内容(在您输入问号的地方没有任何内容)。所以,你还没有问过一个问题。我们不太可能回答不是问题的问题。 【参考方案1】:

由于计算基于未初始化的int numb[count]; 值,您会得到相同输入的随机结果。

根据 C99 标准,第 6.7.8.10 节:

如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。

因为它int numb[count]; 包含一些来自内存的随机垃圾。要获得预测结果,请使用显式初始化:

#include <string.h>  // memset

int numb[count]; 
memset (numb, 0, sizeof(numb));  // Zero-fills

使用下面的代码将filename文件中的数字放入numb

int i = 0;
char line[1024];
fseek(fp, 0, SEEK_SET);
while(fgets(line, sizeof(line), fp) ) 

  if( sscanf(line, "%d", &numb[i]) == 1 )  // One number per line 
  
    ++i;
  

【讨论】:

当我尝试按照您的建议进行初始化时,它给了我这个 int numb[count]=0; fork.c:42:5: 警告: 数组初始化器中的多余元素 [默认启用] fork.c:42:5: 警告: ('numb' 的接近初始化) [默认启用] @AjayaShrestha 这是我的错误,不能用= 0 初始化可变大小的数组。答案已更新。 您确定 sizeof 和 size 数组可以按您的意愿工作吗?我将替换为sizeof *numb * count @Stargateur 我敢肯定,sizeof(numb) 将返回 sizeof(int) * count 输入文件名:file1.dat file1.dat 有 1000 个数字 从选项中选择要使用的进程数 [1,2,4]:1 1 个进程数:1000,numb:-2089032624 ind0= 0 , ind1 = 1000 ind22 14372880 t: 816703723, numb[k]: -2089032624, ind2[0]: 0, ind2[1] : 1000 t2: 816703723 DOne calc Total: 816703723 t: 5数字

以上是关于C fork 和 pipe 从文件中添加数字的主要内容,如果未能解决你的问题,请参考以下文章

C - 内部带有 fork() / pipe() 的 WHILE 循环

c中的fork()和管道()

popen() 可以制作像 pipe() + fork() 这样的双向管道吗?

如何使用 fork() 将数字与父进程和子进程相加 [重复]

c_cpp 一个小样本程序模拟几个工人交替使用fork()和pipe()

Unix上用C程序实现pipe管道命令“ | “(pipe,fork,dup2,close,execl,重定向)