我正在尝试编写一个程序,其中父进程将分叉n个子节点(子节点的node_number)以及子节点必须执行的特定任务对于每个子节点都是相同的。
在我的代码中放置了几个printf后,我意识到子进程中for循环中存在一个错误,即for不会在正确的位置终止,例如,如果代码读取,{{1 printf显示该进程的计数不超过p = 6!
我真的很陌生,即使我在网上搜索过,我也没有找到任何有用的东西!有人可以帮帮我吗?
for(p=0;p<=10; p++)
答案 0 :(得分:1)
首先,对于错误检查,请不要使用printf()
...而是使用fprintf
,然后输出到stderr
,因为它不会缓冲,其中-{{1}并且stdout
会缓冲输出,因此使用带printf
的函数不一定会因为缓冲而在呼叫点打印到控制台。
其次,在你的stdout
循环中,你将内存释放到它看起来没有通过for
分配的指针。这将导致未定义的行为,因为您只能在对malloc()
的调用返回的同一指针上调用free()
...您无法释放数组的“部分”。你只能在完成后立即释放整个已分配内存块。
第三,您向malloc()
传递指向已在堆栈上分配的值的指针(即free()
等)。所以你实际上是在指向堆栈上指向堆地址的地址传递一个指向temp_n
的指针,而不是指向从free()
返回的堆上的内存地址的指针值。 。无论哪种方式,你仍然无法释放数组的一部分,这就是你想要做的事情。
答案 1 :(得分:0)
请注意,使用fork()时,子进程不会彼此共享数据,也不会与父进程共享数据!您无法在父级中设置数据结构,然后使用fork()让子进程填充数据,最后读取父级中的数据。子进程每个都获得数据结构的单独副本,当子进程终止时,该副本将消失。
要创建共享数据的子进程,必须使用pthread_create()。