2016-07-24 40 views
1

シグナルハンドラに引数(構造体へのポインタなど)を渡すにはどうすればよいですか? グローバル変数を使用できないので、マルチスレッドアプリケーションを作成していますCのシグナルハンドラへの引数の受け渡し

私は各スレッドにタイマーを関連付けます。タイマーが切れると、私は構造体を更新する必要があります(各スレッドは異なる構造体を持っています)。

どうすればいいですか?

+0

スレッドローカル変数の使用はどうですか? –

+0

シグナルハンドラにスレッドローカル変数を渡すにはどうしたらいいですか? – WindowsEFI

+0

あなたはもっと明確になりますか?信号の種類は何ですか?そしてあなたが望む出力形式は何ですか? –

答えて

0

システムによってシグナルハンドラが呼び出される方法は固定されています。これを変更して追加のユーザポインタを追加する方法はありません。したがって、シグナルハンドラに追加データを取得したい場合は、それを行う唯一の方法はグローバル変数(スレッドローカルの可能性があります)を使用することです。

timer_createスレッドを使用する場合は、SIGEV_SIGNALではなくSIGEV_THREADを使用するほうがずっと良いでしょう。後者は、信号スレッドではなく、プロセスに信号を送信するため、プロセスのどのスレッドでもキャッチされる可能性があります。

+0

glibcは_Thread_local変数を遅く、動的に割り当てます(あまり好きではないmalloc呼び出しで)、_Thread_localへの最初のアクセスはAS安全ではないようです。私はこれについて、より多くの情報を見つけることができませんでした。 – PSkocik

0

POSIXタイマーでは、に記載されているstruct sigevent構造体を使用して、プロセスに期限切れを通知する方法の詳細を指定できます。

が生成された信号のためのsiggnalハンドラにコンテキスト情報を渡すには、あなたがあなたのシグナルハンドラは、その後取得することができるようになります .sigev_value.sival_ptrメンバーを設定することができます( struct sigaction.sa_sigaction部材を介してシグナルハンドラを設定する必要があります構造体の .sa_flagsSA_SIGACTIONでORredであることを確認しながら)。

関連する問題