Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用fork()运行多个任务_C_Fork - Fatal编程技术网

C 使用fork()运行多个任务

C 使用fork()运行多个任务,c,fork,C,Fork,试图并行运行“任务”,但(显然)我失败得很惨 我想让它做的是:将大小分成8个不同(相同大小)的任务,同时对它们进行“doSomething” #include <stdio.h> #include <unistd.h> #include <sys/types.h> //pid_t void doSomething(const int start, const int end){ printf("%d. Doing %d to %d \n", getp

试图并行运行“任务”,但(显然)我失败得很惨

我想让它做的是:将大小分成8个不同(相同大小)的任务,同时对它们进行“doSomething”

#include <stdio.h>
#include <unistd.h>
#include  <sys/types.h> //pid_t
void doSomething(const int start, const int end){
    printf("%d. Doing %d to %d \n", getpid(), start, end);
}

int main(){

    int word_size = 10000;

    for(int i=0; i<3; i++){
        pid_t pid;
        pid = fork();
        if(pid == 0){
            doSomething((i)*(word_size/8), (i+1)*(word_size/8));
        }
        else {
            doSomething((i+1)*(word_size/8), (i+2)*(word_size/8));
        }
    }
    return 0;
}
#包括
#包括
#包括//pid\t
无效剂量测量(常数开始,常数结束){
printf(“%d.执行%d到%d\n”,getpid(),开始,结束);
}
int main(){
int word_size=10000;

对于(int i=0;i,根据您的逻辑,您将只能覆盖5000个单词(根据您的字号1000),即使您将运行8个重复进程

我想你需要逻辑方面的帮助。稍微调整一下for循环就可以了:

#include <stdio.h>
#include <unistd.h>
#include  <sys/types.h> //pid_t
void doSomething(const int start, const int end){
    printf("%d. Doing %d to %d \n", getpid(), start, end);
}

int main(){

    int word_size = 10000;

    for(int i=0; i<=6; i=i+2){        //the tweaks
        pid_t pid;
        pid = fork();
        if(pid == 0){
            doSomething((i)*(word_size/8), (i+1)*(word_size/8));
        }
        else {
            doSomething((i+1)*(word_size/8), (i+2)*(word_size/8));
        }
    }
    return 0;
}
#包括
#包括
#包括//pid\t
无效剂量测量(常数开始,常数结束){
printf(“%d.执行%d到%d\n”,getpid(),开始,结束);
}
int main(){
int word_size=10000;

对于(int i=0;i您并不是真的将其拆分为8个偶数部分。您只是启动4个并行进程,然后在主线程中按顺序执行其他4个部分。此外,您一完成就退出主线程,让并行进程在空闲时完成。因此,实际上您需要以下内容:

    pid_t pid[8];
    for (int i = 0; i < 8; i++) {
        pid[i] = fork();
        if(pid[i] == 0){
            doSomething((i)*(word_size/8), (i+1)*(word_size/8));
            return 0;  // or exit(0);
        }
   }
for (int i = 0; i < 8; i++) {
     int status;
     waitpid(pid[i], &status, WNOHANG);
}

您确定要单独的进程而不是线程吗?@ChrisTurner,是的,试图避免pthread您的父进程不应该执行该函数;只有子进程应该执行该函数。请不要忘记在退出之前等待子进程死亡。@空格为什么要避免pthread?如果
fork
返回-1,可能需要执行一些操作,例如break ou循环的t?或者至少,不要为任何失败的子项调用
waitpid
。@Serge,谢谢你的评论。但是,这似乎也不起作用。基本上,我得到了很多进程,重复同样的工作。结果:你需要确保你的
doSomething
不返回,而是退出。或者你可以直接执行在循环中。我将编辑答案。就像在调用doSomething后添加退出(0)一样?要试试吗!