我是linux操作系统的新手,所以我试图设计一个共享库,这将启动一个线程,我有以下代码:
函数init_log没有引发它在日志中没有显示的分段错误,虽然有人告诉我原因吗?
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 ****
答案 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
的博客文章