Я работаю над выполнением обновления iptables через пользовательскую программу c, использующую libiptc.Требование состоит в том, чтобы вызывать API-интерфейсы iptc из отдельного потока каждые 2 секунды.
Я написал простую программу на C, чтобы попытаться вызвать API-интерфейсы iptc из отдельного потока.Программа c вставлена ниже.
/*** thread_iptc.c ***/
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void* thread_func(void* unused)
{
struct iptc_handle *handle = NULL;
char *table = "filter";
while (1)
{
printf("\nthread_func(): While loop.\n");
handle = iptc_init(table);
if (handle) {
printf("thread_func(): handle is not NULL.\n");
iptc_free(handle);
}
else
printf("thread_func(): handle is NULL.\n");
sleep(2);
}
return NULL;
}
int main()
{
struct iptc_handle *handle = NULL;
char *table = "filter";
pthread_t thread_id;
handle = iptc_init(table);
if (handle) {
printf("main(): handle is not NULL.\n");
iptc_free(handle);
}
else
printf("main(): handle is NULL.\n");
pthread_create(&thread_id, NULL, &thread_func, NULL);
pthread_join(thread_id, NULL);
return 0;
}
Проблема, с которой я сталкиваюсь, заключается в том, что вызов как iptc_init(
), так и iptc_free()
хорошо работает при вызове из функции main
.Тем не менее, вызов iptc_free()
завершается неудачно с «Ошибка сегментации» при вызове из thread_func()
.
Вывод программы:
# ./test
main(): handle is not NULL.
thread_func(): While loop.
thread_func(): handle is not NULL.
Segmentation fault
Компиляция:
# gcc -o test thread_iptc.c -lpthread -lext4 -lext6 -lip4tc -lip6tc -liptc -lxtables -ldl
GDBBacktrace
#0 0x00007ffff79be303 in iptc_free () from /lib64/libip4tc.so.0
#1 0x00000000004007f3 in thread_func ()
#2 0x00007ffff7bc77e1 in start_thread () from /lib64/libpthread.so.0
#3 0x00007ffff6efb8ed in clone () from /lib64/libc.so.6
Я что-то упустил во время компиляции или при вызове нового потока?