カーネル バージョン 2.6.10 と「プレーン」C を使用しています。
プログラムがクラッシュする理由について、2 つのスレッドに絞り込みました。
タイマースレッド
void TimerThread(void)
{
while (exec) {
usleep(10000);
RSLTCD r = SUCCESS;
// r = LockMutex(Mtx);
do {
// some process
} while(1);
// r = UnlockMutex(Mtx);
}
return ; // Not Reached
}
システムスレッド
void SystemThread(void)
{
CreateThread(TimerThread, OALTHRD_DEFAULT_STACKSIZE, THREADPRI_NORMAL, 0, 0);
for(;;){
system("echo this is a SYSTEM CALL 1");
system("echo this is a SYSTEM CALL 2");
}
}
残りのコードをすべて削除しました。この 2 つの「単純な」スレッドを実行しただけでも、数回 (50 ~ 100 回) ループするとプログラムがクラッシュします。また、system() が fork() を使用しており、fork()ing とミューテックスで問題が発生することもあると読みました。そのため、ミューテックス部分を削除しましたが、それでもクラッシュします。
fork()+execv() コンボと posix_spawn() を使用して、独自の「システム コール」関数を作成してみました。どちらの場合も同じ結果になりました。
また、usleep 以外のスリープ機能 (nano_sleep など) を使用してみました。それでもプログラムがクラッシュします。
マルチスレッド プロセスで system() と usleep() を使用すると問題がありますか? これらの関数を使用する以外に、他にどのような選択肢がありますか?