timer_create()関数が呼び出されたときにスレッドIDを取得する方法を調べています。 timer_create()が呼び出されるたびに、新しいスレッド(メインプロセスの子スレッド)が作成されることがわかりました。 ps -eLでgrepを確認しました。timer_create()の呼び出し時の新しいスレッド
timer_createを使用する私のプログラムの中でps -eLと同じTID(子スレッドID)を表示する必要があります。 以下のコードから:私のプログラムの中でTID 18018を取得するにはどうすればよいですか?
すべての投稿を調査したところ、通知機能を呼び出してtimer_create()を呼び出さないと、新しいスレッドが作成されたという記述がありました。
ご協力いただきありがとうございます。
コード:
SLGTRACER_DEFINE(testMain, "testMain");
timer_t audit_timer1;
void timeoutHandler(sigval_t info)
{
slgInfo(testMain, "timeoutHandler invoked");
slgInfo(testMain, "gettid() = %lu TESTMAIN", syscall(SYS_gettid));
slgInfo(testMain, "getpid() = %d TESTMAIN", getpid());
}
int main(void)
{
slgInfo(testMain, "testMain Invoked");
struct sigevent evp1;
evp1.sigev_notify = SIGEV_THREAD;
evp1.sigev_value.sival_ptr = &audit_timer1;
evp1.sigev_notify_function = timeoutHandler;
evp1.sigev_notify_attributes = NULL;
const int ERROR_BUFFER_SIZE = 50;
slgInfo(testMain, "Before FIRST timer_create");
sleep(30);
// Create timer thread
if (timer_create(CLOCK_REALTIME, &evp1, &audit_timer1) != 0)
{
// Character buffer for storing error message.
char errBuff[ERROR_BUFFER_SIZE];
memset(errBuff, 0, ERROR_BUFFER_SIZE);
slgError(testMain,
"timer_start create failed. Error = %s",
strerror_r(errno, errBuff, ERROR_BUFFER_SIZE));
timer_delete(audit_timer1);
bzero(&audit_timer1, sizeof(audit_timer1));
}
slgInfo(testMain, "After FIRST timer_create");
sleep(30);
return 0;
}
bash-3.1# ps -eL|grep testM
16651 16651 pts/0 00:00:00 testMain
16651 18018 pts/0 00:00:00 testMain
child thread with ID created by timer_create() = 18018
複数のテストの後、timer_create()が呼び出されたときに子スレッドが作成されていることがわかりました。私は自分のプログラムでそのスレッドIDを取得しようとしています。そのスレッドIDを使用して、そのスレッドのスケジュールオプションを設定します。 – LinuxNewbie
はい、timer_create()が呼び出された後、timeoutHandler()が呼び出される前にスレッドが存在します。 – LinuxNewbie
@LinuxNewbieこれが必要な場合は、struct sigeventのsigev_notify_attributesメンバーとしてpthread_attr_tを指定することができます。こうすることで、たとえばpthread_attr_setschedpolicyなどで設定された属性でスレッドを初期化できます。この新しい情報で質問を更新/変更する必要があります。 – nos