这个程序为什么会死循环?(附源代码)
#include<stdio.h>
int main()
{
int t;
unsigned sum=0;
while( t=fork()!=-1){
printf("pid=%d ", getpid());
sum++;
}
if(t==-1){
perror("fork");
printf("sum=%d", sum);
}
exit(0);
}
我想让它算出系统最大还能支持开多少个进程,虽然没什么实际意义,但这个程序的结果并不理想!
它为什么会死循环???
问题点数:20、回复次数:10Top
1 楼fierygnu(va_list)回复于 2006-03-12 22:40:34 得分 1
while( t=fork()!=-1){
应该是
while( (t=fork()) !=-1){
=的优先级最低。Top
2 楼nancygreen(Nancy)回复于 2006-03-12 23:05:37 得分 0
改了以后,还是死循环Top
3 楼fierygnu(va_list)回复于 2006-03-13 09:41:50 得分 0
死循环?系统死了吗?Top
4 楼yzx1983(捕风捉影)回复于 2006-03-14 13:21:50 得分 0
说说具体现象,怎么就“死循环”了?Top
5 楼tengulre(debian core developer)回复于 2006-03-14 14:48:11 得分 15
在while里面加个定时器sleep(1);Top
6 楼victor03(dullboy)回复于 2006-03-14 15:11:10 得分 2
应该是系统死了!程序好像在做细胞分裂,fork后父,子进程都会继续fork,很快系统的资源就会耗光了吧!Top
7 楼eduyu(杜宇)回复于 2006-03-14 19:04:44 得分 2
进程是指数级增加呀。因为子进程又会分裂,所以你理论得到的结果是死机的时候所有这个程序fork和来的所有程序和本身这个程序打印出来数目的总和。麻烦。换个算法或者方法吧。Top
8 楼nancygreen(Nancy)回复于 2006-03-20 14:31:10 得分 0
这个程序是能很多用尽系统资源,但因为操作系统内存管理,任务调度机制的完善,它并不会死机,只不过CPU总是100%的在工作着。有时候还会出现
out of memory: killed process 1186(sendmail)
out of memory: killed process 1020(portmap)
...................................
这样的系统提示。但没关系,它还能继续运行,因为init会去清除那些僵死进程。它会不停的运行,但永远都不会停止,出现不了fork()==-1的状态。
当它在后台运行过程中我也试图插进别的shell命令,系统有时会提示:
-bash: fork: Resource temporarily unavailable
应该是说系统资源不够了,不能再fork了,但那个程序为什么不正常终止呢?
其实这个程序算法上没什么问题,就是要指数增长,这样才能快速算出我要的值。问题是父进程不能比子进程早结束,不然那些僵进程会被init自动清空。
wait()或waitpid()只能等到一个子进程结束或一个信号来就唤醒父进程。有没有什么方法让父进程等到它所创建的所有子进程结束后再被唤醒?Top
9 楼nancygreen(Nancy)回复于 2006-03-20 17:53:05 得分 0
帖一个完整的这个程序执行中#ps -al命令得到的结果。很迷惑怎么中间怎么会出现这样的结果?那些PPID为1的,它们的父进程一定是非正常结束?到底是什么原因引起的非正常结束?是因为fork不成功吗?按照这个程序流程,不成功就是正常结束,还有什么不非正常结束的可能?
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 7597 1237 2 81 0 - 335 - tty1 00:00:00 t
5 Z 0 7598 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 7601 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 7603 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 7605 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 7613 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 7619 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 7676 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 7686 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 7692 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 7694 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 8413 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 8422 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 8428 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 8430 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 9621 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 9631 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 9635 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 9637 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 10130 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 10140 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 10146 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 11286 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 11295 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 11301 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 11851 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 11860 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 11866 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 11868 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 12847 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 12857 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 12863 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 12865 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 13405 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 13415 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 13420 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 13422 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 14255 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 14265 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 14269 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 14271 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 14762 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 14772 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 14778 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 14780 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 15706 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 15715 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 15721 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 15723 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 16147 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 16155 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 16159 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 16161 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 17290 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 17297 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 17302 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 17304 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 17620 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 17630 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 17633 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 17635 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 18885 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 18893 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 18897 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 18899 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 19225 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 19235 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 19238 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 19240 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 20410 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 20419 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 20425 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 20427 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 20844 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 20852 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 20856 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 20858 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 21952 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 21962 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 21968 7597 0 83 0 - 0 do_exi tty1 00:00:00 t <defunct>
Top
10 楼nancygreen(Nancy)回复于 2006-03-20 17:58:26 得分 0
接上页,才知道这里发帖有长度限制,那就省略一点吧,把不太一样有变化的帖出来,如果都帖有640行
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
5 Z 0 25711 22342 0 84 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 26705 26704 0 85 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 R 0 26706 1 0 85 0 - 335 - tty1 00:00:00 t
5 R 0 26708 1 0 85 0 - 335 - tty1 00:00:00 t
5 Z 0 26721 26720 0 85 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 R 0 26724 1 0 85 0 - 335 - tty1 00:00:00 t
5 Z 0 26727 26720 0 85 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 26730 25128 0 84 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 26734 25128 0 84 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 R 0 27270 1 0 85 0 - 335 - tty1 00:00:00 t
1 R 0 27273 1 0 85 0 - 335 - tty1 00:00:00 t
1 R 0 27274 1 0 85 0 - 335 - tty1 00:00:00 t
5 Z 0 27275 25126 0 84 0 - 0 do_exi tty1 00:00:00 t <defunct>
1 R 0 27279 1 0 85 0 - 335 - tty1 00:00:00 t
5 Z 0 27281 25126 0 84 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 R 0 27282 1 0 85 0 - 335 - tty1 00:00:00 t
5 Z 0 27284 23542 0 84 0 - 0 do_exi tty1 00:00:00 t <defunct>
1 R 0 27289 1 0 85 0 - 335 - tty1 00:00:00 t
5 Z 0 27294 23542 0 84 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 27299 23542 0 84 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 Z 0 27303 23893 0 84 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 R 0 27307 1 0 85 0 - 335 - tty1 00:00:00 t
5 Z 0 27312 23893 0 84 0 - 0 do_exi tty1 00:00:00 t <defunct>
5 R 0 27315 1 0 85 0 - 335 - tty1 00:00:00 t
5 Z 0 27318 23893 0 84 0 - 0 do_exi tty1 00:00:00 t <defunct>
1 R 0 27328 1 0 85 0 - 335 - tty1 00:00:00 t
5 R 0 27332 1 0 85 0 - 335 - tty1 00:00:00 t
5 R 0 27337 1 0 84 0 - 335 - tty1 00:00:00 t
5 R 0 27343 1 0 85 0 - 335 - tty1 00:00:00 t
1 R 0 27355 1 0 85 0 - 335 - tty1 00:00:00 t
5 R 0 27372 1 0 85 0 - 335 - tty1 00:00:00 t
5 R 0 27377 1 0 85 0 - 335 - tty1 00:00:00 t
5 R 0 27379 1 0 85 0 - 335 - tty1 00:00:00 t
1 R 0 27387 1 0 85 0 - 335 - tty1 00:00:00 t
Top




