我想用共享内存和CyclicBarrier
父进程和子进程来计算阶乘。我的问题是子进程似乎不起作用,我想从父进程给出一个数字,并且在子进程后父母的阶乘结果。但结果与我给出的数字相同。
我被要求使用fork()
或snprintf()
或spritnf()
和itoa()
,以便将变量传递给每个流程。
我达到了以下目的:
atoi()
答案 0 :(得分:2)
你有:
if(fid>0)//parent process
{
wait(&status);
父进程做的第一件事是等待孩子死亡。只有这样才会要求输入计算的数字。这不会很好。
您需要父母询问号码,将其写入共享内存,并通过某种(其他)IPC机制告诉孩子该号码已准备就绪。然后孩子应该醒来,读取数字,进行计算,然后写下答案,然后通过退出通知父母完成。同时,父母现在可以等待孩子完成,然后从共享内存中读取答案。
如果是我的代码,我会在致电shmat()
之前执行fork()
。如上所述,孩子使用shmat()
两次(一次在fork()
之后,一次在else if (fid == 0)
代码中。这不是正统的。
创建key_t key = 1990;
然后不使用它很奇怪。我也没有看到使用status
和x
。
作为计算阶乘的一种方法,这是荒谬的。作为IPC和进程间同步的练习,这是一个很好的简单示例。
请记住,32位整数最多只能存储12个值!而64位整数只能存储最多20个值!因此,创建一个阶乘表通常是明智的 - 或者只是动态计算它们。或者你需要使用浮点运算;它需要一段时间才能摆脱它们的范围(大约小于200!,IIRC)。