C 在Linux中修改子进程中的全局变量

C 在Linux中修改子进程中的全局变量,c,concurrency,C,Concurrency,我来自C#背景,我在C中的并发性有点困难。我不会对你撒谎。。。这是我必须为学校做的一个项目的一部分。虽然我在专业上与高级语言打过交道,但我的高级论文教授强迫全班同学用C语言编写代码(我们中的大多数人对……几乎没有经验):(),这让我们感到很尴尬 不管是哪种情况,回到问题上来。我有一个全局整数变量(从0开始),它需要同时递增5个进程,直到达到100(而不是100%) 基本上,现在的情况是,每个子进程不是单独修改completionCounter,而是复制它 是否有一个锁(object)或类似于C#

我来自C#背景,我在C中的并发性有点困难。我不会对你撒谎。。。这是我必须为学校做的一个项目的一部分。虽然我在专业上与高级语言打过交道,但我的高级论文教授强迫全班同学用C语言编写代码(我们中的大多数人对……几乎没有经验):(),这让我们感到很尴尬

不管是哪种情况,回到问题上来。我有一个全局整数变量(从0开始),它需要同时递增5个进程,直到达到100(而不是100%)

基本上,现在的情况是,每个子进程不是单独修改completionCounter,而是复制它

是否有一个
锁(object)
或类似于C#中提供的类型的东西?我尝试使用二进制信号量,但无法使其工作,我还没有使用共享内存

const int THREADCOUNT = 5;
int completionCounter = 0;

int main(int argc, char **argv)
{
    int count = 0;
    pid_t pid;    

    for(count = 0; count<THREADCOUNT; count++)
    {
        if( (pid = fork()) < 0 )
        {
            //error...
            return -1;
        }
        else if( pid == 0 )
        {
            //child;
            while(completionCounter != 100 )
            {
                printf("[%i] process downloading data chunk...", getpid());

                //do stuff here

                completionCounter += 5;

            }
        }
        else
        {
            //parent.
        }
    }    
}
const int THREADCOUNT=5;
int completionCounter=0;
int main(int argc,字符**argv)
{
整数计数=0;
pid_t pid;

对于(count=0;count这不是由争用问题引起的,而是在创建新进程时(使用时会发生这种情况),将创建一个新的内存空间副本。这实际上意味着您正在创建5个
completionCounter
s--每个进程一个。如果希望所有进程都共享相同的内存空间,请研究使用。

子进程不与其父进程共享变量。使用分叉子进程的唯一方法是使用sp具体地说,创建和映射共享内存以保存值

一种更合理的方法是使用线程而不是子进程,但似乎您被分配给您的任务困住了。在这种情况下,我建议如下:

int *x = mmap(0, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
在分叉之前,然后在子进程中递增
*x

但是


现在,您必须处理同步问题。照目前的情况,您的输出中很容易出现丢失或重复的数字。查找POSIX处理共享互斥以开始这一方向…

您完全正确,可以使用信号量实现您想要的。请尝试
man 3 sem_wait
,这里有一个示例。

fork()创建一个新进程,而不是一个线程——这就是为什么他们要创建一个值的副本。编辑:我要做的是创建一个“服务器”进程,其中有5个子“工作”进程,它们与pipes@Rob通信。如果我要使用forks,我如何强制每个子进程修改全局值而不是复制它?是的,怎么做你如何获得信号量的实例?当你调用
semget()时
您只能获取整数信号量标识符。我无法使用信号量的原因是无法获取信号量值。即使是获取该值的函数也需要一个我不知道如何获取的
sem\u t
对象?@bleepzter,信号量用于保护对多线程环境中某些代码的访问。您可以n使用共享内存存储您的值和一个信号量(如果您使用线程,则使用pthreads mutex)来保护它。我们实际上不知道OP被赋予了什么赋值。我不认为有任何理由认为教授要求项目使用fork。@Jim:OP说“我有一个全局整数变量(从0开始)需要同时增加5个进程,直到达到100。线程不是进程。当然,OP或讲师可能不理解这一点……OP写道“这是我必须为学校做的一个项目的一部分”。不能假设“问题”OP是由教授指定的——这似乎是OP确定的一些子问题,但可能是基于错误的设计。请注意,讲师是OP的“高级论文教授”——即“项目”吉姆:好的,我同意你的推理,同时我认为如果它是正确的,那么OP的问题措辞就非常糟糕。