【发布时间】:2013-02-25 14:54:54
【问题描述】:
我目前正在做一个小项目,当超出特定限制以处理以下步骤(例如警报、空路由等)时,它会捕获数据包并触发外部应用程序或脚本。
我尝试使用此代码创建一个非常简单的触发器(“触发器”包含二进制文件或脚本的路径):
char * trigger_complete;
sprintf(trigger_complete, "%s %u %u %s %s %Lf", trigger, data[II].count, data[II].proto, inet_ntoa(data[II].src_ip), inet_ntoa(data[II].dst_ip), rate);
system (trigger_complete);
在我的 Ubuntu 12.04.1 LTS 上,它似乎可以正常工作,我使用“echo”应用程序进行了测试。
linux-gate.so.1 => (0xb779f000)
libpcap.so.0.8 => /usr/lib/i386-linux-gnu/libpcap.so.0.8 (0xb7752000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75a8000)
/lib/ld-linux.so.2 (0xb77a0000)
在 Debian Wheezy 和“grml”实例上,我在执行二进制文件时收到分段错误。 (我通过注释掉并重试验证了这个问题是由上面的代码段引起的。)
linux-vdso.so.1 => (0x00007fff875ff000)
libpcap.so.0.8 => /usr/lib/x86_64-linux-gnu/libpcap.so.0.8 (0x00007fa9c6048000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa9c5cbe000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa9c608d000)
我看到的唯一区别是架构,Ubuntu 系统是 32 位操作系统,而 Debian 是 64 位操作系统。
我不确定这是否是问题所在,但似乎确实如此。
谁能帮我解决这个问题?
提前谢谢你!
【问题讨论】:
-
...可能想为
trigger_complete分配一些内存! -
顺便说一句:inet_ntoa() 返回一个指向静态分配缓冲区的指针。在 printf() 的参数中调用它两次可能会导致结果看起来相等,因为第二次调用会覆盖第一次调用的结果。顺便说一句:真正的错误可能在您没有显示的行中。
-
似乎使用 malloc() 对我有用。我将不得不进一步检查。到目前为止,谢谢。
-
您关于 inet_ntoa() 的提示是正确的,我必须解决这个问题,但这是另一章;)谢谢!
-
是的,本来可以的。顺便说一句,检查段错误的一个好工具是“valgrind”。