Linux上的简单线程和信号程序将无法运行

时间:2013-10-17 01:48:05

标签: c linux pthreads signals

这个程序应该

父母只是无限期地等待任何孩子返回(提示,waitpid)。 湾孩子设置了两个信号处理程序(提示,信号)并进入睡眠状态5分钟。 一世。第一个信号处理程序侦听USR1信号,并在收到它时: 1.创建一个线程(提示,pthread_create)。 一个。基本上,线程需要做的就是“打个招呼”并睡60个小时 秒。 II。第二个信号处理程序侦听USR2信号,并在收到它时: 1.销毁线程(提示,pthread_destroy)。

我的代码编译得很好,就在我运行它时,绝对没有任何反应,甚至没有我作为测试放在那里的第一个printf。我一直盯着它看了一个小时,没有错误,所以为什么不跑呢?

编辑:现在运行,感谢charlie,但是当它创建线程时,它输出“[thread]睡眠1米[线程]睡眠1分钟”然后结束,它永远不会等待第二个信号

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>

pthread_t thread;

void* temp()
{
    printf("[thread] hello professor\n");
    printf("[thread] sleeping for 1 minute\n");
    sleep(60);
}
void handle_USR1(int x)
{
    int s;
    printf("[signal] creating the thread\n");
    s = pthread_create(&thread, NULL, &temp, NULL);
}

void handle_USR2(int x)
{
    int s;
    printf("[signal] destroying the thread\n");
    s = pthread_cancel(thread);
}

int main(void)
{
    int status = 0;

    if(fork() != 0)
    {
     printf("[parent] waiting.....\n");
     waitpid(-1, &status, 0);
    }
    else
    {
     printf("[child] to create the thread: kill -USR1 %d\n", getpid());
     printf("[child] to end the thread: kill -USR2 %d\n", getpid());
     printf("[child] setting up signal handlers\n");

     signal(SIGUSR1, handle_USR1);
     signal(SIGUSR2, handle_USR2);

     printf("[child] waiting for signals\n");
     sleep(300);
    }
    return (0);
}

2 个答案:

答案 0 :(得分:1)

为所有printf添加换行符“\ n”。如果没有它,stdout将不会刷新,看起来你的程序即使它没有工作。

另外,检查fork()是否有失败是一个好主意。 fork()在失败时返回-1并设置errno。

答案 1 :(得分:1)

我在搜索其他内容时登陆了这个问题,并意识到一旦SIGUSR1信号被处理,你的程序就会终止。您需要通过发出pthread_join等待您的线程,例如您正在等待子进程

void handle_USR1(int x) { int s; printf("[signal] creating the thread\n"); s = pthread_create(&thread, NULL, &temp, NULL); pthread_join(thread, NULL); }