{"id":434,"date":"2022-11-24T22:53:15","date_gmt":"2022-11-24T14:53:15","guid":{"rendered":"http:\/\/pareto.fun\/?p=434"},"modified":"2022-11-28T10:47:07","modified_gmt":"2022-11-28T02:47:07","slug":"%e4%bf%a1%e5%8f%b7-pending%e3%80%81block%e3%80%81unblock","status":"publish","type":"post","link":"http:\/\/pareto.fun\/?p=434","title":{"rendered":"\u4fe1\u53f7 pending\u3001block\u3001unblock"},"content":{"rendered":"\n<pre class=\"wp-block-preformatted\">   <strong>Signal mask and pending signals<\/strong>\n       A signal may be <em>blocked<\/em>, which means that it will not be\n       delivered until it is later unblocked.  Between the time when it\n       is generated and when it is delivered a signal is said to be\n       <em>pending<\/em>.\nhttps:\/\/man7.org\/linux\/man-pages\/man7\/signal.7.html<\/pre>\n\n\n\n<p>\u6839\u636e\u6587\u6863\uff0c\u4fe1\u53f7\u53ef\u4ee5\u662fblocked \u6216\u8005unblocked\uff0c\u4fe1\u53f7\u53ef\u4ee5\u4ec5\u9762\u5411\u8fdb\u7a0b\u548c\u4ec5\u9762\u5411\u7ebf\u7a0b<\/p>\n\n\n\n<p><strong>blocked \u4fe1\u53f7<\/strong><\/p>\n\n\n\n<p>\u9488\u5bf9blocked \u7684\u4fe1\u53f7 \u4e0d\u4f1a\u4ea4\u7531\u8fdb\u7a0b\u5904\u7406\u77e5\u9053\u8fd9\u4e2a\u4fe1\u53f7unblocked\u3002pending \u662f\u4fe1\u53f7\u4ea7\u751f\u7136\u540e\u4ea4\u7531\u8fdb\u7a0b\u5904\u7406\u7684\u72b6\u6001\u3002<\/p>\n\n\n\n<p><strong>unblocked\u4fe1\u53f7<\/strong><\/p>\n\n\n\n<p>\u5c06\u4f1a\u4ea4\u7531\u4fe1\u53f7\u5904\u7406\u51fd\u6570\u5904\u7406\uff0c\u64cd\u4f5c\u7cfb\u7edf\u5224\u65ad\u5f53\u524d\u662f\u5426\u6709\u6302\u8d77(pending)\u7684\u975e\u963b\u585e(unblocked)\u4fe1\u53f7.<\/p>\n\n\n\n<ol><li>\u5185\u6838\u505a\u4e9b\u51c6\u5907\u5de5\u4f5c\uff1a<ol><li>\u4ece\u6302\u8d77\u7684\u4fe1\u53f7\u96c6\u5408\u4e2d\u79fb\u9664\u3002<\/li><li>\u5728sigaction \u6307\u5b9aSA_ONSTACK \u6807\u5fd7\uff0c\u5219\u51c6\u5907\u6808\u3002<\/li><li>\u4fdd\u5b58\u4fe1\u53f7\u76f8\u5173\u4e0a\u4e0b\u6587\u3002<\/li><li>\u914d\u7f6esigprocmask\u8bbe\u7f6e\u7684\u4fe1\u53f7\u63a9\u7801\uff0c\u88ab\u5904\u7406\u7684\u5fc3\u6709\u4e5f\u4f1a\u52a0\u5165\u4fe1\u53f7\u63a9\u7801\u9664\u975e\u8bbe\u7f6eSA_NODEFER\u3002\u8fd9\u4e9b\u4fe1\u53f7\u5728\u4fe1\u53f7\u5904\u7406\u5668\u6267\u884c\u671f\u95f4\u90fd\u662f\u963b\u585e\u72b6\u6001\u3002<\/li><\/ol><\/li><li>\u5185\u6838\u7ed9\u4fe1\u53f7\u5904\u7406\u51fd\u6570\u5206\u914d\u4e00\u6bb5\u6808\uff0c\u5c06pc\u6307\u5411\u51fd\u6570\u5934\uff0c\u914d\u7f6e\u597d\u8fd4\u56de\u5730\u5740\u3002<\/li><li>\u5185\u6838\u5c06\u63a7\u5236\u6d41\u8fd8\u7ed9\u7528\u6237\u6001\u7684\u4fe1\u53f7\u5904\u7406\u51fd\u6570<\/li><li>\u5f53\u4fe1\u53f7\u5904\u7406\u51fd\u6570\u8fd4\u56de\u65f6\uff0c\u8df3\u8f6c\u5230\u4fe1\u53f7\u8df3\u677f(trampoline)\u51fd\u6570\u3002<\/li><li>\u4fe1\u53f7\u8df3\u677f\u51fd\u6570\u8c03\u7528sigreturn\u3002\u8fd8\u539f\u4fe1\u53f7\u63a9\u7801\uff0c\u56de\u5230\u7528\u6237\u6001\uff0c\u88ab\u7ebf\u7a0b\u5904\u7406\u51fd\u6570\u4e2d\u65ad\u7684\u7ebf\u7a0b\u91cd\u65b0\u5f00\u59cb\u8fd0\u884c\u3002<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/\r\n\/\/ Created by pareto on 11\/24\/22.\r\n\/\/\r\n#include&lt;sys\/types.h>\r\n#include&lt;sys\/stat.h>\r\n#include&lt;unistd.h>\r\n#include&lt;fcntl.h>\r\n#include&lt;stdio.h>\r\n#include&lt;stdlib.h>\r\n#include&lt;errno.h>\r\n#include&lt;string.h>\r\n#include&lt;signal.h>\r\n#include&lt;pthread.h>\r\n\r\n#define ERR_EXIT(m) \\\r\n    do { \\\r\n        perror(m); \\\r\n        exit(EXIT_FAILURE); \\\r\n    } while(0)\r\n\r\nint flag = 0;\r\nvoid handler(int sig)\r\n{\r\n    puts(\"Hello WOrld\\n\");\r\n    if (sig == SIGINT){\r\n        printf(\"recv a sig=%d\\n\", sig);\r\n        fflush(0);\r\n    }\r\n\r\n    else if (sig == SIGQUIT)\r\n    {\r\n        printf(\"rev a sig=%d\\n\", sig);\r\n        sigset_t uset;\r\n        sigemptyset(&amp;uset);\r\n        sigaddset(&amp;uset, SIGINT);\r\n        sigprocmask(SIG_UNBLOCK, &amp;uset, NULL);\r\n        flag = 1;\r\n    }\r\n\r\n    sleep(1000000000);\r\n\r\n}\r\n\r\nvoid printsigset(sigset_t *set)\r\n{\r\n    int i;\r\n    for (i = 1; i &lt; NSIG; i++)\r\n    {\r\n        if (sigismember(set, i))\r\n            putchar('1');\r\n        else\r\n            putchar('0');\r\n    }\r\n    printf(\"\\n\");\r\n}\r\n\r\nvoid* anotherThread(void* args) {\r\n\r\n    if (signal(SIGINT, handler) == SIG_ERR)\r\n        ERR_EXIT(\"signal error\");\r\n\r\n    sleep(1000000000);\r\n    return NULL;\r\n}\r\n\r\nint main(int argc, char *argv&#91;])\r\n{\r\n    if (signal(SIGINT, handler) == SIG_ERR)\r\n        ERR_EXIT(\"signal error\");\r\n    if (signal(SIGQUIT, handler) == SIG_ERR)\r\n        ERR_EXIT(\"signal error\");\r\n\r\n    sigset_t pset; \/\/ 64bit\r\n    sigset_t bset;\r\n    sigemptyset(&amp;bset);\r\n    sigaddset(&amp;bset, SIGINT);\r\n\/\/    sigaddset(&amp;bset, SIGQUIT);\r\n    \/\/sigprocmask(SIG_BLOCK, &amp;bset, NULL);\r\n\r\n    pthread_t tid;\r\n    pthread_create(&amp;tid, NULL, &amp;anotherThread, NULL);\r\n\r\n    sleep(1000000000);\r\n    printf(\"exit\\n\");\r\n    exit(0);\r\n\r\n    for (; ;)\r\n    {\r\n        sigpending(&amp;pset); \/\/return the set of signal thar are pending for delivery\r\n        printsigset(&amp;pset);\/\/print all pending signal\r\n        sleep(1);\r\n\/\/        if (flag == 1)\r\n\/\/            sigprocmask(SIG_UNBLOCK, &amp;bset, NULL);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Signal mask and pending signals A signal may be bl [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[42],"tags":[43,44],"_links":{"self":[{"href":"http:\/\/pareto.fun\/index.php?rest_route=\/wp\/v2\/posts\/434"}],"collection":[{"href":"http:\/\/pareto.fun\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/pareto.fun\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/pareto.fun\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/pareto.fun\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=434"}],"version-history":[{"count":4,"href":"http:\/\/pareto.fun\/index.php?rest_route=\/wp\/v2\/posts\/434\/revisions"}],"predecessor-version":[{"id":439,"href":"http:\/\/pareto.fun\/index.php?rest_route=\/wp\/v2\/posts\/434\/revisions\/439"}],"wp:attachment":[{"href":"http:\/\/pareto.fun\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/pareto.fun\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=434"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/pareto.fun\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}