全局变量未由C中的子进程更新

时间:2017-02-08 00:41:31

标签: c

我正在尝试打印子进程所恭维的单词并将其添加起来。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> 
#include <sys/types.h>
#include <sys/wait.h>

count_t word_count(char *file)
{
   -counts the words from a file---
 }



 int main(int argc, char **argv)
{
    int i,j, numFiles,pid_count[10],pid;

    int global;



    numFiles = atoi(argv[1]);


    printf("counting %d files..\n", numFiles);
    j=0;
    for(i = 0; i < numFiles; i++)
    {


            pid_count[i] = fork();

                if(pid_count[i] < 0) {
                printf("Error creating the child process\n");

                } else if (pid_count[i] == 0) {

                char filename[100];
                sprintf(filename, "%s/text.%02d", FILEPATH, i);
                printf("read: %s\n", filename);
                int local;
                printf("Child PID: %d Handling File No : %d\n",getpid(), i);
                local = word_count(filename);
                global += local;

                exit(0);

                } else  {
                continue;
                }



    }
    int wstatus;
    for(i = 0; i < numFiles; i++)
    {
            waitpid(pid_count[i], &wstatus, 0);

    }
        printf("total word count is %d",global);

    return(0);
 }

但是在输出中,全局变量只打印0,而每个局部变量都有精确的计数,它只是不加起来全局

2 个答案:

答案 0 :(得分:5)

进程只是不这样做。每个子进程都获取父进程的内存副本,但它只是:副本。对子进程所做的更改对于父进程是不可见的,即它们不共享内存。

如果要与子项共享内存,可以考虑使用线程而不是进程。或者如果您愿意,可以使用共享内存(有几种方法可以在进程之间共享内存)。但无论如何,你需要一些同步原语,你不希望所有的线程/进程同时进入同一个内存位置......

另一种不同的选择是根本不共享内存,而是每个子进程可以通过一些进程间通信(管道或其他东西)将结果值发送给父进程,并且父进程将添加它们。

答案 1 :(得分:1)

子进程是一个不同的进程。它运行与父进程相同的代码,但它拥有自己父进程的数据段的副本。

每个子流程都会修改自己的localglobal变量副本。它们与父进程中定义的global变量不同(因为它们位于不同的进程中,并且它们之间没有共享内存。)

有几种方法可以让孩子将send data处理到父进程。我认为最简单的方法是使用管道。阅读this tutorial。它包含一个小程序,可以帮助您理解这个概念。