C 需要帮助我弄清楚我需要更改什么以实现所需的更改吗

C 需要帮助我弄清楚我需要更改什么以实现所需的更改吗,c,fork,waitpid,C,Fork,Waitpid,我尝试了一些方法,但无法使其工作,规格是下一步,谢谢 使用fork和waitpid函数,实现此程序的新版本,其中由remover_ruido执行的处理分为16个进程 我的第一个方法是: const int NPROCESSES = 16; pid_t pids[128]; for (int i = 0; i < NPROCESSES;i ++) { pids[i] = fork(); if (!pids[i]) { remover_

我尝试了一些方法,但无法使其工作,规格是下一步,谢谢

使用fork和waitpid函数,实现此程序的新版本,其中由remover_ruido执行的处理分为16个进程

我的第一个方法是:

  const int NPROCESSES = 16;   
  pid_t pids[128];

  for (int i = 0; i < NPROCESSES;i ++) {
     pids[i] = fork();
     if (!pids[i]) {  
       remover_ruido(amostras_out, amostras_in, n_amost);
       exit(0);
  }
}

 for (int i = 0; i < NPROCESSES; i++)
      waitpid(pids[i], 0, 0);
const int n进程=16;
pid_t pid[128];
for(int i=0;i
我做了一个smilar项目,但使用了线程,要求将进程分成50个线程。我不知道我是否能用同样的方法


#包括
#包括
#包括
#包括
#包括
#包括
#定义NMIN 4000
双mytime();
void*malloc_pshared(大小);//阿罗卡·梅莫里亚·帕蒂尔哈达·恩特·普罗索(aloca memória partilhada entre processos)
空隙清除器(短*护墙板向外,短*护墙板向内,向内);
int main(int argc,char*argv[])
{
国际货币基金组织;
如果(argc!=2 | |(n|amost=atoi(argv[1]))
这里有一个轻微的重构,可以在每个进程的基础上分割数据。我编写了代码,但没有编译或测试它:

const int NPROCESSES = 16;
pid_t pids[128];

int chunksize = n_amost / NPROCESSES;       // number of elements per process
int remain = n_amost;                       // number of elements remaining
int curoff;                                 // current offset into arrays
int cursize;                                // current length for process

for (int i = 0; i < NPROCESSES; i++, remain -= cursize) {
    pids[i] = fork();
    if (! pids[i]) {
        // get index into arrays for this process
        curoff = i * chunksize;

        // assume we're a middle process -- use the calculated length
        cursize = chunksize;

        // last process must get the remainder of the array
        if (i >= (NPROCESSES - 1))
            cursize = remain;

        remover_ruido(&amostras_out[curoff], &amostras_in[curoff], cursize);
        exit(0);
    }
}

for (int i = 0; i < NPROCESSES; i++)
    waitpid(pids[i], 0, 0);
const int n进程=16;
pid_t pid[128];
int chunksize=n_amost/n进程;//每个进程的元素数
int remain=n_amost;//剩余元素数
int curoff;//阵列中的当前偏移量
int cursize;//进程的当前长度
for(int i=0;i=(n进程-1))
草书=保留;
移除器_ruido(&amostras_out[curoff]、&amostras_in[curoff],光标);
出口(0);
}
}
for(int i=0;i
请注意,还有其他方法可以分割偏移/长度,但这应该可以让您开始


请注意,您应该仔细检查您的
mmap
调用,以确保它符合您的要求。

此变量与Craig Estey的非常相似,不同之处在于它实际上可以工作,因为它不会在假设将在父级中修改的情况下修改子级中的变量。;-)

只有你的第一条进近路线

需要改成

       int from = n_amost*i/NPROCESSES,
             to = n_amost*(i+1)/NPROCESSES;
       remover_ruido(amostras_out+from, amostras_in+from, to-from);

我尝试了一些方法,但无法使其工作。请编辑您的问题,并在附加代码块中发布此代码。你到底尝试了什么,结果是什么。描述一下你所采用的一般方法。我做了一些类似的事情,但是使用了线程,他们让我将进程分成50个线程。我这里的问题是,我尝试了相同的方法,但每次都会出现错误,where's
malloc_pshared
?我编辑了它,但我将它放回@armali如果我需要检查每个进程是否都在运行,我需要添加什么代码从哪个进程检查每个进程是否都在运行?无论您选择哪一个,都必须防止每个正在运行的进程在检查之前完成。这张支票有什么意义?您已经检查了每个进程是否都使用
waitpid
循环运行。好的,非常感谢您的帮助我忘记了一件事:要查看进程是否无法启动,我们应该添加e。g<代码>如果(pids[i]=-1)perror(“fork”)
fork()
行之后。
       remover_ruido(amostras_out, amostras_in, n_amost);
       int from = n_amost*i/NPROCESSES,
             to = n_amost*(i+1)/NPROCESSES;
       remover_ruido(amostras_out+from, amostras_in+from, to-from);