1

libiptc を使用してカスタム C プログラムを介して iptables の更新を実行する作業を行っています。要件は、2 秒ごとに別のスレッドから iptc API を呼び出すことです。

別のスレッドから iptc API の呼び出しを試す簡単な C プログラムを作成しました。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

GDB バックトレース

#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

コンパイル中または新しいスレッドの呼び出し中に何か不足していますか?

4

0 に答える 0