Ваш пробелем здесь:
pthread_t* _daemon;
Это должно быть:
pthread_t daemon;
Затем измените вызов на pthread_create:
if(pthread_create(&daemon, NULL, &writer, NULL) != 0)
Идея состоит в том, чтоpthread_create получает указатель на существующий pthread_t объект, чтобы он мог заполнить детали.Вы можете думать об этом как о версии C конструктора.Первоначально объект pthread_t неинициализирован, это инициализирует его.
Кроме того, ваш код, вероятно, все еще не всегда будет работать, поскольку вы не ожидаете завершения потока.Убедитесь, что ваш основной поток не заканчивается до всех дочерних элементов:
int main ()
{
initdevice();
pthread_join(daemon, NULL); // wait for the thread to exit first.
return 0;
}