在SharedLibrary中创建线程会引发分段错误

时间:2012-07-04 09:14:29

标签: c linux shared-libraries

我是linux操作系统的新手,所以我试图设计一个共享库,这将启动一个线程,我有以下代码:

  1. 函数init_log没有引发它在日志中没有显示的分段错误,虽然有人告诉我原因吗?

  2. pthread_create函数引发分段错误我使用derror()在日志中打印它!


  3. 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));
        }
    

    编制者链接器参数

    **** 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 ****
    

2 个答案:

答案 0 :(得分: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/

正如alk所指出的那样,也不需要对“NULL”进行类型转换。谢谢你。 :)

答案 1 :(得分:0)

迈向第一个问题。 syslog不会将日志消息直接打印到控制台。它默认写入文件/var/log/message(至少在我的情况下:-)。您可以使用tail -f /var/log/messages查看日志消息。

LOG_CONS中的openlog标志仅表示

  

发送到系统记录器时,如果发生错误,则直接写入系统控制台。

可以找到有关syslog的更多信息here

仅供参考,这是一篇关于linux log files

的博客文章