fork()子进程中的全局变量

时间:2016-08-31 13:26:38

标签: c++ unix fork

尝试制作重复检查功能时遇到问题。

主要目标是将来自子进程的数据(基于返回true或false的check()函数结果)存储到父进程。我已经尝试了全局变量但是没有工作。

这是我的代码:

...

for(j=0; j<indIP; j++)
{
    fflush(stdout);
    if (!(fork()))
    {
        char* this_ip = strdup(ip[j]);
        if(is_duplicate_check(this_ip,"file1"))
        {
            if(debugLevel >= 2) printf("Duplicate IP %s\n", this_ip);
        }
        else if( is_duplicate_check(this_ip,"file2"))
        {
            if(debugLevel >= 2) printf("Duplicate IP %s\n",this_ip);
        }
        else
        {
            if(debugLevel >= 2) printf("Checking IP [%d of %d] -> [%s]\n",current_combo,possible_combinations,ip[j]);                       
            checkauth(this_ip);
        }

        exit(0);
    }
    else
    {
        numforks++;
        current_combo += trys;                  
        if (current_combo > possible_combinations)
        {
            break;
        }

        if (numforks >= maxf)
        {
            wait(NULL);
            numforks--;
        }
    }

    indInterface++;
    if(indInterface>=countInterface) indInterface=0;
}

puts("Finalizing...");
while(numforks>0)
{
    printf("Waiting for the child processes [%d] are finished ....\n", numforks);
    wait(NULL);
    numforks--;
}
puts("Script completed!");
return 0;

...

简而言之,程序从文本文件中读取ips并检查它们是否是某个GEO CODE位置。 is_duplicate_check检查是否已经检查过ip,但它是通过将ips存储到file1file2来工作的,当它到达100.000记录时,它会产生大量负载。

现在我想要的是在数组中存储来自子进程的ips并在调用check()函数之前检查。

我已经尝试了

static int *glob_var;
glob_var = (int *) mmap(NULL, sizeof *glob_var, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);


glob_var++;
printf("glob_var = [%d]\n",glob_var);

总是给我一些像(-1232557773525 ......),没用。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

fork复制内存。因此,当您存储变量时,它与父进程的内存不同。

如果你可以使用线程,你可以拥有共享全局变量的行为(因为线程共享内存)。

或者如果你必须分叉,你可以看看

How to use shared memory with Linux in C

用于共享内存使用或查看boost版本:

http://www.boost.org/doc/libs/1_60_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.sharedmemory