如何解决使用 fork() 创建具有多个子节点的树的值不同并且每次都会发生变化
我尝试根据数组中的值创建进程树。 因此,对于每个进程,其子进程的数量将是在数组中的该单元格中找到的数量。 因此,我保留了一个数字,用于记录目前有多少孩子以及现在正在运行的流程。
问题是为了让进程相互通信,我将这些值保存在内存中的地址(指针)中,但在那里仍然没有同步。
我附上了一张关于数组 {2,3,1,0} 的图片:
这是我的代码:
#include <stdio.h>
#include <unistd.h>
#include <wait.h>
int main(int argc,char* argv){
int current_id=0;// id of the process running now
int son_counter=0; // id for son
int * p_current_id=¤t_id;
int * p_son_counter=&son_counter;
int my_num=0;//process num
int arr[6]={2,2,0};
for(int i=0;i<arr[*p_current_id];i++)
{
pid_t iam=fork();
if(iam==0)//son
{
++(*p_son_counter);
printf("p_son_counter: %d\n",*p_son_counter);
my_num=(*p_son_counter);//++ for the num of son
//printf("p_son_counter: %d\n",*p_son_counter);
while(*p_current_id<my_num)
{
sleep(1);
}
printf("Im process %d - %d and ready to start!\n",my_num,getpid());
i=0;
}
else if(iam!=0)//father
{
printf("im the father %d - %d & i created process %d\n",getpid(),iam);
}
}
printf("p_current_id: %d\n",*p_current_id);
(*p_current_id)++;
printf("p_current_id: %d\n",*p_current_id);
printf("process %d - %d finished his job!",getpid());
while(wait(NULL)>0);
//printf("Process id %d,parent process id %d,my num : %d \n",getppid(),my_id);
return 0;
}
出于某种原因,这是我的输出...
im the father 0 - 8186 & i created process 8187
im the father 0 - 8186 & i created process 8188
p_current_id:0
p_current_id:1
p_son_counter:1
p_son_counter:1
解决方法
在您的代码中没有任何地方使用任何类型的进程间通信机制。如果一个进程修改一个变量在另一个进程中改变了它的值,就会出现混乱。没有代码可以工作 -- 如果同时由两个进程执行,即使 i = i + 1
也可能失败。
通过标识符直接访问变量和通过指针间接访问变量之间没有语义差异。仅使用指针不会突然调用某种神奇的同步形式,以确保在一个进程中修改变量时另一个进程可能正在访问它是安全的。
如果你想在进程之间共享信息,你必须使用一些提供同步和安全的机制。您可以使用文件、套接字、管道、共享内存(使用某种锁定或排他性机制来避免数据竞争)或任何其他可用的东西。
但您必须准确指定哪些内容将共享,哪些内容不共享。
(从技术上讲,您确实使用了 wait
,这是一种进程间通信和同步的形式。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。