0

这个程序应该

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

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

编辑:现在运行,感谢 charlie,但是当它创建线程时,它输出“[thread] sleep for 1 m [thread] sleep for 1 minute”然后结束,它从不等待第二个信号

#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);
}
4

2 回答 2

1

在所有 printf 中添加换行符“\n”。没有它,stdout 将不会刷新,即使它是,你的程序也会出现。

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

于 2013-10-17T02:02:00.470 回答
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); }

于 2017-02-17T10:30:11.180 回答