⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_sig.c

📁 Linux下的中文输入法
💻 C
字号:
/***  GNU Pth - The GNU Portable Threads**  Copyright (c) 1999-2004 Ralf S. Engelschall <rse@engelschall.com>****  This file is part of GNU Pth, a non-preemptive thread scheduling**  library which can be found at http://www.gnu.org/software/pth/.****  This library is free software; you can redistribute it and/or**  modify it under the terms of the GNU Lesser General Public**  License as published by the Free Software Foundation; either**  version 2.1 of the License, or (at your option) any later version.****  This library is distributed in the hope that it will be useful,**  but WITHOUT ANY WARRANTY; without even the implied warranty of**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU**  Lesser General Public License for more details.****  You should have received a copy of the GNU Lesser General Public**  License along with this library; if not, write to the Free Software**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307**  USA, or contact Ralf S. Engelschall <rse@engelschall.com>.****  test_sig.c: Pth test program (signal handling)*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <signal.h>#include <unistd.h>#include "pth.h"static pth_t child1;static pth_t child2;static void *inthandler(void *_arg){    sigset_t sigs;    int sig;    int n;    fprintf(stderr, "inthandler: enter\n");    /* unblock interrupt signal only here */    sigemptyset(&sigs);    sigaddset(&sigs, SIGINT);    pth_sigmask(SIG_UNBLOCK, &sigs, NULL);    /* but the user has to hit CTRL-C three times */    for (n = 0; n < 3; n++) {         pth_sigwait(&sigs, &sig);         fprintf(stderr, "inthandler: SIGINT received (#%d)\n", n);    }    fprintf(stderr, "inthandler: cancelling child1 and child2\n");    pth_cancel(child1);    pth_cancel(child2);    fprintf(stderr, "inthandler: leave\n");    return NULL;}static void child_cleanup(void *arg){    fprintf(stderr, "%s: running cleanup\n", (char *)arg);    return;}static void *child(void *_arg){    sigset_t sigs;    char *name = (char *)_arg;    int i;    fprintf(stderr, "%s: enter\n", name);    /* establish cleanup handler */    pth_cleanup_push(child_cleanup, name);    /* block different types of signals */    pth_sigmask(SIG_SETMASK, NULL, &sigs);    sigaddset(&sigs, SIGINT);    if (strcmp(name, "child1") == 0) {        sigaddset(&sigs, SIGUSR1);        sigdelset(&sigs, SIGUSR2);    }    else {        sigdelset(&sigs, SIGUSR1);        sigaddset(&sigs, SIGUSR2);    }    pth_sigmask(SIG_SETMASK, &sigs, NULL);    /* do a little bit of processing and show signal states */    for (i = 0; i < 10; i++) {        pth_sigmask(SIG_SETMASK, NULL, &sigs);        fprintf(stderr, "%s: SIGUSR1: %s\n", name,                sigismember(&sigs, SIGUSR1) ? "blocked" : "unblocked");        fprintf(stderr, "%s: SIGUSR2: %s\n", name,                sigismember(&sigs, SIGUSR2) ? "blocked" : "unblocked");        fprintf(stderr, "%s: leave to scheduler\n", name);        pth_sleep(1);        fprintf(stderr, "%s: reentered from scheduler\n", name);    }    fprintf(stderr, "%s: leave\n", name);    return NULL;}int main(int argc, char *argv[]){    pth_attr_t attr;    sigset_t sigs;    pth_init();    fprintf(stderr, "This is TEST_SIG, a Pth test using signals.\n");    fprintf(stderr, "\n");    fprintf(stderr, "Hit CTRL-C three times to stop this test.\n");    fprintf(stderr, "But only after all threads were terminated.\n");    fprintf(stderr, "\n");    fprintf(stderr, "main: init\n");    /* block signals */    pth_sigmask(SIG_SETMASK, NULL, &sigs);    sigaddset(&sigs, SIGUSR1);    sigaddset(&sigs, SIGUSR2);    sigaddset(&sigs, SIGINT);    pth_sigmask(SIG_SETMASK, &sigs, NULL);    /* spawn childs */    attr = pth_attr_new();    pth_attr_set(attr, PTH_ATTR_NAME, "child1");    child1 = pth_spawn(attr, child, (void *)"child1");    pth_attr_set(attr, PTH_ATTR_NAME, "child2");    child2 = pth_spawn(attr, child, (void *)"child2");    pth_attr_set(attr, PTH_ATTR_NAME, "inthandler");    pth_spawn(attr, inthandler, (void *)"inthandler");    pth_attr_destroy(attr);    /* wait until childs are finished */    while (pth_join(NULL, NULL));    fprintf(stderr, "main: exit\n");    pth_kill();    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -