小编Ian*_*anC的帖子

libpcap:pcap_breakloop()导致内存泄漏

在使用Linux pthreadlibpcap时,我注意到使用时有些奇怪的行为pcap_breakloop我的目标是: 打开一个新线程,该线程将运行pcap_loop并处理捕获的数据包,而主线程将执行其他操作。收到信号(SIGINT)或退出时,将设置一个全局变量,并且主线程将发出指令pcap_breakloop以结束第二个线程,然后完成自身。

这个想法可能仍然需要一些工作,但是我注意到的奇怪行为是:

当我们创建一个bpf_program结构和编译pcap_compile,以进一步使用它作为在捕获过滤器,一旦我们退出使用循环pcap_breakloop有8个字节(包括内存泄漏pcap_freecodepcap_close被调用)。即使不使用线程也是如此(就像在修改过的sniffex.c libpcap示例中所示)。没有过滤器(没有pcap_compile调用或bpf_program)的相同代码退出而没有内存泄漏

libpcap会发生这种内存泄漏,就像我在其他库上看到的某些内存泄漏一样gtk吗?图书馆以后会处理吗?还是我看不到我的代码有问题?

下面是代码示例:使用pthread和修改后的sniffex示例的示例pcap_breakloop(由于代码很大,但由于实际差异很小,所以我还包括了diff原始sniffex和修改后的示例):

pthreads示例:

#include <pcap.h>
#include <stdio.h>
#include <pthread.h>
#include <signal.h>

int CLOSE_PROGRAM = 0;
int CAPTURE_SETUP_SUCCESS = 0;
pcap_t *handler;    //pcap_t handler and filter structure are globals …
Run Code Online (Sandbox Code Playgroud)

c memory-leaks pthreads libpcap

5
推荐指数
1
解决办法
791
查看次数

为什么不是 scanf("%*[^\n]\n"); 和 scanf("%*[^\n]%*c"); 清除挂起的换行符?

调用后,scanf("%d", &variable);我们会在stdin处留下一个换行符,应该在调用 之前清除fgets它,否则我们最终会为其提供换行符并使其过早返回。

我找到了建议scanf("%*[^\n]%*c");在第一次调用后使用scanf以丢弃换行符和其他建议使用scanf("%*[^\n]\n");. 从理论上讲,这两个应该工作:一是要消耗的一切,是不是一个换行符(但不包括新行本身),然后消耗正好一个字符(新行)。第二个将消耗不是换行符的所有内容(不包括它),然后\n,一个空白字符,将指示scanf读取每个空白字符,直到第一个非空白字符。

然而,尽管我认为这些方法在某些答案中有效,但我无法让它们在这里工作(下面的代码)。

为什么这两种scanf方法都不起作用?

测试:Ubuntu Linux - gcc5.4.0

scanf("%*[^\n]\n"); 方法:

#include <stdio.h>

int main(int argc, char **argv){
    int number;
    char buffer[1024];

    printf("Write number: \n");
    scanf("%d", &number);

    //Clearing stdin?
    scanf("%*[^\n]\n");

    printf("Write phrase: \n");
    fgets(buffer, 1024, stdin);

    printf("\n\nYou wrote:%u and \"%s\"\n", number, buffer);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ ./bug 
Write number: 
2
Write phrase: 


You wrote:2 and " …
Run Code Online (Sandbox Code Playgroud)

c stdin scanf fgets

5
推荐指数
1
解决办法
1335
查看次数

Jekyll:默认的 _data 排序标准是什么?

迭代文件夹中的文件数组时_data,对文件进行排序的默认标准是什么?

起初我希望它按字母顺序排序,但经过一些测试后我意识到事实并非如此。尽管如此,我还是无法弄清楚对文件进行排序的标准是什么。

{%- for file in site.data.folder -%}
{{ file | inspect }}
<br />
<br />
{%- endfor -%}
Run Code Online (Sandbox Code Playgroud)

据我了解,file这是一个包含文件名作为第一个元素和数据作为第二个元素的数组,因此我不确定sort与任何属性名称一起使用是否有效。当我尝试时,我收到了错误消息:

Liquid Exception: no implicit conversion of String into Integer

当不带参数使用时sort,我可以返回按文件名字母顺序排序的文件:

{%- assign files = site.data.folder | sort -%}
{%- for file in files -%}
{{ file | inspect }}
<br />
<br />
{%- endfor -%}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  • 文件的默认排序标准是什么_data
  • 是否可以根据对象属性进行排序?(我认为这个问题是在访问时拥有一个数组而不是纯对象site.data.folder

例子:

创建默认 Jekyll 页面后,我创建了目录_data/folder,其中包含 5 个随机 …

jekyll

5
推荐指数
1
解决办法
891
查看次数

标签 统计

c ×2

fgets ×1

jekyll ×1

libpcap ×1

memory-leaks ×1

pthreads ×1

scanf ×1

stdin ×1