gpt4 book ai didi

c - 共享内存中的信号量、进程和递增变量

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:30 25 4
gpt4 key购买 nike

这是一道作业题。我必须编写一个 fork 20 次的程序。每个新进程都将 +1 添加到一个变量(整数),该变量在所有进程之间共享。问题是,我必须使用信号量 (IPC)。这段代码“有效”- 最后给出了 20 的值。

*buf = 0;
for(i=1; i<=20; ++i)
{
if(fork()!=0)
{
*buf += 1;
exit(0);
}
}

编辑:基于this代码我正在尝试获得如下输出:
我是 child 1...
我是 child 2...
.
.
.
我是 child 20...

它工作了一次(第一次),然后顺序就变成了随机的。但是我没有更改任何代码。我做错了什么?

最佳答案

你的主要问题是:

    if (fork()!=0)   //<-- this

fork() 将在出错时返回 -1,父进程 pid,或子进程为零。所以你实际上是在父级中做所有事情。更改为 (fork() ==0),它会执行您想要的操作。

您还应该等待您的 child 并分离共享内存。 (我添加了一些进程 ID 的输出以使其更清晰一些。)

printf("I AM THE PARENT pid = %d\n", getpid());

*buf = 0;
for(i=1; i<=20; ++i)
{
if((pid = fork()) == -1)
{
perror("fork");
exit(1);
}

if (pid == 0)
{
v(semid, 0);
*buf += 1;
p(semid, 0);
printf("I am child %d with pid = %d\n", i, getpid());
shmdt(buf);
exit(0);
}
}


for (i = 1; i <= 20; ++i)
{
pid = wait(&status);
printf("child pid = %d reaped\n", pid);
}

printf("buf: %p\n", buf);
printf("*buf: %d\n", *buf);

shmdt(buf);

return 0;

关于c - 共享内存中的信号量、进程和递增变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8706826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com