system + usleep + multi-thread = SEGV / SIGILL

时间:2013-03-04 09:51:38

标签: c linux linux-kernel embedded-linux

我使用的是内核版本2.6.10和“普通”C。

我已经缩小了两个线程来解决我们的程序崩溃的原因。

TIMER THREAD

void TimerThread(void)
{
    while (exec) {
        usleep(10000);

        RSLTCD r = SUCCESS;
        // r = LockMutex(Mtx);
        do {
              // some process
        } while(1);     
        // r = UnlockMutex(Mtx);
    }
    return ;        // Not Reached
}

SYSTEM THREAD

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

我删除了所有剩下的代码,即使只运行这两个“简单”线程, 几个循环(50-100)后程序将崩溃。 我还读过system()使用fork(),有时fork()和互斥有问题。 所以我删除了互斥锁部分,但它仍然崩溃。

我尝试使用fork()+ execv()组合以及posix_spawn()创建自己的“系统调用”函数。 两种情况都产生了相同的结果。

另外,我尝试过使用其他睡眠功能而不是睡眠。(nano_sleep等) 程序仍然崩溃

在多线程进程中使用system()和usleep()是否有问题?除了使用这些功能之外,我还有哪些其他选择?

1 个答案:

答案 0 :(得分:1)

基本上混合多线程和“fork()”并不容易,需要更多有关SW的详细信息才能提供有用的帮助。有关混合线程和fork()时问题的描述,请阅读http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them