试图弄清楚为什么儿童进程会比他们应该更早终止

时间:2011-07-12 15:46:01

标签: c process wait fork

我正在尝试编写一个程序,其中父进程将分叉n个子节点(子节点的node_number)以及子节点必须执行的特定任务对于每个子节点都是相同的。

在我的代码中放置了几个printf后,我意识到子进程中for循环中存在一个错误,即for不会在正确的位置终止,例如,如果代码读取,{{1 printf显示该进程的计数不超过p = 6!

我真的很陌生,即使我在网上搜索过,我也没有找到任何有用的东西!有人可以帮帮我吗?

for(p=0;p<=10; p++)

2 个答案:

答案 0 :(得分:1)

首先,对于错误检查,请不要使用printf() ...而是使用fprintf,然后输出到stderr,因为它不会缓冲,其中-{{1}并且stdout会缓冲输出,因此使用带printf的函数不一定会因为缓冲而在呼叫点打印到控制台。

其次,在你的stdout循环中,你将内存释放到它看起来没有通过for分配的指针。这将导致未定义的行为,因为您只能在对malloc()的调用返回的同一指针上调用free() ...您无法释放数组的“部分”。你只能在完成后立即释放整个已分配内存块。

第三,您向malloc()传递指向已在堆栈上分配的值的指针(即free()等)。所以你实际上是在指向堆栈上指向堆地址的地址传递一个指向temp_n的指针,而不是指向从free()返回的堆上的内存地址的指针值。 。无论哪种方式,你仍然无法释放数组的一部分,这就是你想要做的事情。

答案 1 :(得分:0)

请注意,使用fork()时,子进程不会彼此共享数据,也不会与父进程共享数据!您无法在父级中设置数据结构,然后使用fork()让子进程填充数据,最后读取父级中的数据。子进程每个都获得数据结构的单独副本,当子进程终止时,该副本将消失。

要创建共享数据的子进程,必须使用pthread_create()。