为什么pause(2)在辅助线程中不返回?

Nebuch

考虑一下我设置的示例来说明这一点。

#define _POSIX_C_SOURCE 199506L

#include <unistd.h>
#include <stdio.h>
#include <sys/time.h>
#include <errno.h>
#include <signal.h>
#include <pthread.h>

void hand(int sig);
void *thrfn(void *arg);

int main(void)
{
    struct sigaction act;
    struct itimerval timer;
    sigset_t mask;
    pthread_t thr;

    act.sa_handler = hand;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGALRM, &act, NULL);
    /* error checking omitted */

    timer.it_interval.tv_sec = 1;
    timer.it_interval.tv_usec = 500000;
    timer.it_value = timer.it_interval;
    /* ultimately I want to build a loop; hence repeating */
    setitimer(ITIMER_REAL, &timer, NULL);

    sigemptyset(&mask);
    pthread_sigmask(SIG_SETMASK, &mask, NULL);
    /* why doesn't this prevent SIGALRM from interrupting main? */
    pthread_create(&thr, NULL, thrfn, NULL);

    puts("Main thread done.");
    getchar();

    return 0;
}

void hand(int sig)
{
    (void)sig;
    write(STDOUT_FILENO, "Handler handled.\n", 17);
}

void *thrfn(void *arg)
{
    sigset_t mask;

    (void)arg;

    sigemptyset(&mask);
    sigaddset(&mask, SIGALRM);
    pthread_sigmask(SIG_SETMASK, &mask, NULL);
    /* why doesn't this make pause() return in this thread? */

    pause();
    puts("Off thread's pause returned.");
    pthread_exit(NULL);
}

这是用gcc编译的输出:

Main thread done.
Handler handled.

消息之间间隔约一秒半的时间。

为什么我的第二个线程pause永不返回?

我猜错误是在使用中pthread_sigmask使用SIG_BLOCKSIG_UNBLOCK而不是SIG_SETMASK您期望的程序行为。

#define _POSIX_C_SOURCE 199506L

#include <unistd.h>
#include <stdio.h>
#include <sys/time.h>
#include <errno.h>
#include <signal.h>
#include <pthread.h>

void hand(int sig);
void *thrfn(void *arg);

int main(void)
{
    struct sigaction act;
    struct itimerval timer;
    sigset_t mask;
    pthread_t thr;

    act.sa_handler = hand;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGALRM, &act, NULL);
    /* error checking omitted */

    timer.it_interval.tv_sec = 1;
    timer.it_interval.tv_usec = 500000;
    timer.it_value = timer.it_interval;
    /* ultimately I want to build a loop; hence repeating */
    setitimer(ITIMER_REAL, &timer, NULL);

    sigemptyset(&mask);
    sigaddset(&mask, SIGALRM);
    pthread_sigmask(SIG_BLOCK, &mask, NULL);
    /* This prevent SIGALARM interrupring the main */
    pthread_create(&thr, NULL, thrfn, NULL);

    puts("Main thread done.");
    getchar();

    return 0;
}

void hand(int sig)
{
    (void)sig;
    write(STDOUT_FILENO, "Handler handled.\n", 17);
}

void *thrfn(void *arg)
{
    sigset_t mask;

    (void)arg;

    sigemptyset(&mask);
    sigaddset(&mask, SIGALRM);
    pthread_sigmask(SIG_UNBLOCK, &mask, NULL);
    /* This make the pause() return on SIGALARM */
    pause();
    puts("Off thread's pause returned.");
    pthread_exit(NULL);
}

该程序提供以下输出:

$ ./test 
Main thread done.
Handler handled.
Off thread's pause returned.

您可能会在这里这里找到答案

特别是:

sigemptyset(&mask);
pthread_sigmask(SIG_SETMASK, &mask, NULL);

您将取消取消主线程中的所有信号。同时,带有:

sigemptyset(&mask);
sigaddset(&mask, SIGALRM);
pthread_sigmask(SIG_SETMASK, &mask, NULL);

您仅SIGALARM在子线程上进行阻止这可能与您想做的相反。请记住,使用SIG_SETMASK可以指定一组被阻止的信号。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

辅助线程中的MessageBox

来自分类Dev

辅助线程中的MessageBox

来自分类Dev

为什么bindservice在将其移动到辅助线程后仍然导致应用程序ANR

来自分类Dev

为什么从辅助线程更新tkinter小部件似乎有效?

来自分类Dev

从辅助线程刷新DataGrid

来自分类Dev

在辅助线程中读取GUI对象数据

来自分类Dev

从辅助线程调用主线程的功能

来自分类Dev

线程,UI线程,辅助线程,异步任务

来自分类Dev

2个sidekiq辅助线程可以处理同一作业吗?

来自分类Dev

2个sidekiq辅助线程可以处理同一作业吗?

来自分类Dev

在C代码中的Pthread(辅助线程)下调用GTK_MAIN

来自分类Dev

使用Qt构建OpenCV时,辅助线程中的cvShowImage块

来自分类Dev

在C代码中的Pthread(辅助线程)下调用GTK_MAIN

来自分类Dev

是从调用线程还是辅助线程调用BackgroundWorker的OnDoWork?

来自分类Dev

是从调用线程还是辅助线程调用BackgroundWorker的OnDoWork?

来自分类Dev

Python PyQT:如何从辅助线程调用GUI函数?

来自分类Dev

从辅助线程启动可执行文件

来自分类Dev

Looper,辅助线程和其他并发问题

来自分类Dev

带有Windows窗体和辅助线程的VSTO

来自分类Dev

如何确定我的android runnable在辅助线程上启动?

来自分类Dev

为什么2 == 4不返回false?

来自分类Dev

方法不返回Java中的辅助变量

来自分类Dev

为什么“ www” .count(“ ww”)返回1而不返回2?

来自分类Dev

辅助线程内部填充的字符串数组,但主线程将数组显示为null

来自分类Dev

PyQt5 Gui线程到辅助线程信号/插槽

来自分类Dev

从辅助线程重定向标准输出(使用函数而不是类进行多线程?)

来自分类Dev

为什么hIsEOF不返回?

来自分类Dev

为什么phantomjs不返回

来自分类Dev

Map中Set的通配符-返回类型不兼容-为什么?

Related 相关文章

  1. 1

    辅助线程中的MessageBox

  2. 2

    辅助线程中的MessageBox

  3. 3

    为什么bindservice在将其移动到辅助线程后仍然导致应用程序ANR

  4. 4

    为什么从辅助线程更新tkinter小部件似乎有效?

  5. 5

    从辅助线程刷新DataGrid

  6. 6

    在辅助线程中读取GUI对象数据

  7. 7

    从辅助线程调用主线程的功能

  8. 8

    线程,UI线程,辅助线程,异步任务

  9. 9

    2个sidekiq辅助线程可以处理同一作业吗?

  10. 10

    2个sidekiq辅助线程可以处理同一作业吗?

  11. 11

    在C代码中的Pthread(辅助线程)下调用GTK_MAIN

  12. 12

    使用Qt构建OpenCV时,辅助线程中的cvShowImage块

  13. 13

    在C代码中的Pthread(辅助线程)下调用GTK_MAIN

  14. 14

    是从调用线程还是辅助线程调用BackgroundWorker的OnDoWork?

  15. 15

    是从调用线程还是辅助线程调用BackgroundWorker的OnDoWork?

  16. 16

    Python PyQT:如何从辅助线程调用GUI函数?

  17. 17

    从辅助线程启动可执行文件

  18. 18

    Looper,辅助线程和其他并发问题

  19. 19

    带有Windows窗体和辅助线程的VSTO

  20. 20

    如何确定我的android runnable在辅助线程上启动?

  21. 21

    为什么2 == 4不返回false?

  22. 22

    方法不返回Java中的辅助变量

  23. 23

    为什么“ www” .count(“ ww”)返回1而不返回2?

  24. 24

    辅助线程内部填充的字符串数组,但主线程将数组显示为null

  25. 25

    PyQt5 Gui线程到辅助线程信号/插槽

  26. 26

    从辅助线程重定向标准输出(使用函数而不是类进行多线程?)

  27. 27

    为什么hIsEOF不返回?

  28. 28

    为什么phantomjs不返回

  29. 29

    Map中Set的通配符-返回类型不兼容-为什么?

热门标签

归档