0

我对 linux 操作系统很陌生,所以我正在尝试设计一个共享库,女巫将启动一个线程,我有以下代码:

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

编译器链接器参数

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

2 回答 2

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”。谢谢你。:)

于 2012-07-04T09:27:48.507 回答
0

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

中的LOG_CONS标志openlog仅表示

如果在发送到系统记录器时出现错误,请直接写入系统控制台。

更多信息syslog可以在这里找到

仅供参考,这是一篇关于linux 日志文件的博文

于 2012-07-04T10:14:16.453 回答