0

私はLinuxOSに非常に慣れていないので、共有ライブラリを設計しようとしています。魔女はスレッドを開始します。次のコードがあります。

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

もう1つのポイントは、関数の名前を指定するだけで、そのアドレスを渡すことができるということです。&その前にを追加する必要はありません。

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 に答える