2012-07-04 4 views
0

Я очень новой для ОС Linux, так что я пытаюсь создать общую библиотеку ведьму будет начать нить у меня есть followin код:Создание потока в SharedLibrary возникает ошибка сегментации

  1. Функция init_log не вызывает ошибку сегментации, которая не отображается в журнале, хотя может кто-нибудь сказать мне, почему?

  2. Функция pthread_create вызывает ошибку сегментации, я использую derror(), чтобы напечатать это в журнале!


void __attribute__ ((constructor)) setup(); 

void init_log() 
{ 
    setlogmask(LOG_UPTO(LOG_NOTICE)); 
    openlog("TRACKER",LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); 
} 

    void loop() 
    { 
     while (0 == 0) 
     { 
      syslog(LOG_NOTICE,"OK BOSS"); 
      sleep(1000); 
     } 
    } 

    void setup() 
    { 
     pthread_t thread_id; 
     init_log(); 
     syslog(LOG_NOTICE,"LIB LOADED"); // this doesn't display 
     pthread_create(&thread_id,0,&loop,(void*)(NULL)); 
    } 

КОМПИЛЯТОРА ЛИНКЕР PARAMS

**** Build of configuration Debug for project gt_trackers **** 

make all 
Building target: libgt_trackers.so 
Invoking: GCC C Linker 
gcc -shared -o "libgt_trackers.so" ./main.o 
Finished building target: libgt_trackers.so 

**** Build Finished **** 
+0

Вы можете оставить команду компилятора? – hmjd

+0

@hmjd Редактировать вопрос – opc0de

+0

Попробуйте добавить параметр '-Wall', чтобы компилятор показывал вам все, что вам не нравится, переводя ваш код ... ;-) – alk

ответ

2

void loop() Функция должна быть void *loop (void *)

и вызов pthread_create должно быть

pthread_create(&thread_id,0,loop,NULL); 

Прототип для pthread_create представлен ниже. Вы должны соответствовать прототипу вашей функции цикла с помощью «start_routine», упомянутой ниже.

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
        void *(*start_routine) (void *), void *arg); 

Другое дело, что просто указать имя функции достаточно, чтобы передать ее адрес. Не нужно добавлять & перед этим.

Ссылка на Pthread руководство: https://computing.llnl.gov/tutorials/pthreads/

Как отметил алк, нет необходимости в типаж "NULL" также. Спасибо, алк. :)

+0

Просто избили меня на секунду.Btw: нет необходимости бросать 'NULL' ... – alk

+0

@alk, Это случается со мной все время. :) Спасибо за ваш комментарий. Я не обратил на это внимания. Обновлен мой ответ. – Jay

+0

Теперь я получаю эту ошибку: void * loop (void *) - имя параметра опущено – opc0de

0

К вашему первому вопросу. syslog не выводит сообщение журнала непосредственно на консоль. Он записывает файл /var/log/message по умолчанию (по крайней мере, в моем случае :-). Вы можете использовать tail -f /var/log/messages, чтобы просмотреть сообщение в журнале.

LOG_CONS флаг в openlog только означает, что

запись непосредственно в системную консоль, если есть ошибка при отправке в системный журнал.

Более подробную информацию о syslog можно найти here

FYI, вот блог о linux log files