{"id":2592,"date":"2019-06-05T22:09:27","date_gmt":"2019-06-05T14:09:27","guid":{"rendered":"http:\/\/learn-house.idv.tw\/?p=2592"},"modified":"2019-06-05T22:09:27","modified_gmt":"2019-06-05T14:09:27","slug":"%e8%bd%89linux-ipc-system-v-%e4%bf%a1%e5%8f%b7%e9%87%8f","status":"publish","type":"post","link":"https:\/\/learn-house.idv.tw\/?p=2592","title":{"rendered":"[\u8f49]Linux IPC System V \u4fe1\u53f7\u91cf"},"content":{"rendered":"<p>\u8cc7\u6599\u4f86\u6e90\uff1ahttps:\/\/www.cnblogs.com\/xiaojiang1025\/p\/5936135.html<\/p>\n<h2 id=\"\u6a21\u578b\">\u6a21\u578b<\/h2>\n<pre><code class=\"hljs cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;sys\/types.h&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;sys\/ipc.h&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;sys\/sem.h&gt;<\/span><\/span>\r\nftok()              <span class=\"hljs-comment\">\/\/\u83b7\u53d6key                 <\/span>\r\nsemget()            <span class=\"hljs-comment\">\/\/\u521b\u5efa\/\u83b7\u53d6\u4fe1\u53f7\u91cf\u96c6     <\/span>\r\nsemctl()            <span class=\"hljs-comment\">\/\/\u521d\u59cb\u5316\u4fe1\u53f7\u91cf\u96c6           <\/span>\r\nsemop()             <span class=\"hljs-comment\">\/\/\u64cd\u4f5c\u4fe1\u53f7\u91cf\u96c6            <\/span>\r\nsemctl()            <span class=\"hljs-comment\">\/\/\u5220\u9664\u4fe1\u53f7\u91cf\u96c6            <\/span><\/code><\/pre>\n<p><!--more--><\/p>\n<h2 id=\"ftok\">ftok()<\/h2>\n<pre><code class=\"hljs java\"><span class=\"hljs-comment\">\/\/\u83b7\u53d6key\u503c, key\u503c\u662fSystem V IPC\u7684\u6807\u8bc6\u7b26\uff0c\u6210\u529f\u8fd4\u56dekey\uff0c\u5931\u8d25\u8fd4\u56de-1\u8bbeerrno<\/span>\r\n<span class=\"hljs-comment\">\/\/\u540cpathname+\u540c proj_id==&gt;\u540ckey_t;<\/span>\r\n<span class=\"hljs-function\">key_t <span class=\"hljs-title\">ftok<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">char<\/span> *pathname, <span class=\"hljs-keyword\">int<\/span> proj_id)<\/span><\/span>;<\/code><\/pre>\n<p><strong>pathname<\/strong>\u00a0:\u6587\u4ef6\u540d<br \/>\n<strong>proj_id<\/strong>: 1~255\u7684\u4e00\u4e2a\u6570\uff0c\u8868\u793aproject_id<\/p>\n<pre><code class=\"hljs awk\">key_t key=ftok(<span class=\"hljs-string\">\".\"<\/span>,<span class=\"hljs-number\">100<\/span>);    <span class=\"hljs-regexp\">\/\/<\/span>\u201c.\u201d\u5c31\u662f\u4e00\u4e2a\u5b58\u5728\u4e14\u53ef\u8bbf\u95ee\u7684\u8def\u5f84, <span class=\"hljs-number\">100<\/span>\u662f\u5047\u8bbe\u7684proj_id\r\n    <span class=\"hljs-keyword\">if<\/span>(-<span class=\"hljs-number\">1<\/span>==key)\r\n        perror(<span class=\"hljs-string\">\"ftok\"<\/span>),<span class=\"hljs-keyword\">exit<\/span>(-<span class=\"hljs-number\">1<\/span>);<\/code><\/pre>\n<h2 id=\"semget\">semget():<\/h2>\n<pre><code class=\"hljs cpp\"><span class=\"hljs-comment\">\/\/\u521b\u5efa\/\u83b7\u53d6\u4e00\u4e2a\u4fe1\u53f7\u91cf\u96c6\uff0c\u6210\u529f\u8fd4\u56desemid\uff0c\u5931\u8d25\u8fd4\u56de-1<\/span>\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">semget<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">key_t<\/span> key, <span class=\"hljs-keyword\">int<\/span> nsems, <span class=\"hljs-keyword\">int<\/span> semflg)<\/span><\/span>;<\/code><\/pre>\n<p><strong>nsems<\/strong>: \u4fe1\u53f7\u91cf\u96c6\u7684\u5927\u5c0f\/\u4fe1\u53f7\u91cf\u7684\u4e2a\u6570\uff0c0\u8868\u793a\u83b7\u53d6\u5df2\u7ecf\u5b58\u5728\u7684\u4fe1\u53f7\u91cf\u96c6<br \/>\n<strong>semflg<\/strong><\/p>\n<ul>\n<li><strong>IPC_CREAT<\/strong>\u00a0:\u82e5\u4e0d\u5b58\u5728\u5219\u521b\u5efa, \u9700\u8981\u5728msgflg\u4e2d\uff02|\u6743\u9650\u4fe1\u606f\uff02; \u82e5\u5b58\u5728\u5219\u6253\u5f00<\/li>\n<li><strong>IPC_EXCL<\/strong>\u00a0:\u82e5\u5b58\u5728\u5219\u521b\u5efa\u5931\u8d25<\/li>\n<li><strong>0<\/strong>\u00a0:\u83b7\u53d6\u5df2\u7ecf\u5b58\u5728\u7684\u4fe1\u53f7\u91cf\u96c6<\/li>\n<\/ul>\n<pre><code class=\"hljs awk\"><span class=\"hljs-regexp\">\/\/<\/span>create sem\r\nsemid=semget(key,<span class=\"hljs-number\">1<\/span>,IPC_CREAT|IPC_EXCL|<span class=\"hljs-number\">0664<\/span>);\r\n<span class=\"hljs-keyword\">if<\/span>(-<span class=\"hljs-number\">1<\/span>==semid)\r\n    perror(<span class=\"hljs-string\">\"semid\"<\/span>),<span class=\"hljs-keyword\">exit<\/span>(-<span class=\"hljs-number\">1<\/span>);<\/code><\/pre>\n<h2 id=\"semctl\">semctl()<\/h2>\n<pre><code class=\"hljs java\"><span class=\"hljs-comment\">\/\/\u4e3b\u8981\u7528\u4e8e\u5bf9\u6307\u5b9a\u7684\u4fe1\u53f7\u91cf\u96c6\/\u4fe1\u53f7\u91cf\u6267\u884c\u6307\u5b9a\u7684\u64cd\u4f5c,\u6210\u529f\u8fd4\u56de0,\u5931\u8d25\u8fd4\u56de-1\u8bbeerrno<\/span>\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">semctl<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> semid, <span class=\"hljs-keyword\">int<\/span> semnum, <span class=\"hljs-keyword\">int<\/span> cmd, ...)<\/span><\/span>;<\/code><\/pre>\n<p><strong>semid<\/strong>: \u4fe1\u53f7\u91cf\u96c6\u7684\u7f16\u53f7(\u54ea\u4e2a\u4fe1\u53f7\u91cf\u96c6)<br \/>\n<strong>semnum<\/strong>: \u4fe1\u53f7\u91cf\u96c6\u7684\u4e0b\u6807(\u8fd9\u4e2a\u4fe1\u53f7\u91cf\u96c6\u91cc\u7684\u54ea\u4e2a\u4fe1\u53f7\u91cf)<br \/>\n<strong>cmd<\/strong>:\u5177\u4f53\u7684\u64cd\u4f5c\u547d\u4ee4<\/p>\n<ul>\n<li><strong>IPC_STAT<\/strong>\u00a0\u5c06\u5185\u6838\u4e2d\u4e0esemid\u76f8\u5173\u7684\u4fe1\u606f\u62f7\u8d1d\u5230arg.buf\u6307\u5411\u7684\u7ed3\u6784\u4f53\u4e2d<\/li>\n<li><strong>IPC_SET<\/strong>\u5c06buf\u6307\u5411\u7684semid_ds\u7ed3\u6784\u4f53\u7684\u90e8\u5206\u5185\u5bb9\u5199\u5165\u5230\u5185\u6838\u4e2d\u7684\u76f8\u5173\u6570\u636e\u7ed3\u6784\u4e2d\uff0c\u540c\u65f6\u66f4\u65b0sem_ctime\u6210\u5458<\/li>\n<li><strong>IPC_RMID<\/strong>\u00a0\u7acb\u5373\u9500\u6bc1\u6307\u5b9a\u7684\u4fe1\u53f7\u91cf\u96c6\uff0c\u8c03\u7528\u7684\u8fdb\u7a0b\u7684\u7684effective UID\u5fc5\u987b\u548c\u4fe1\u53f7\u91cf\u96c6\u7684\u521b\u5efa\u8005\u6216\u6240\u6709\u8005\u76f8\u5339\u914d\uff0c\u6216\u8005\u8fd9\u4e2a\u8fdb\u7a0b\u6709\u8db3\u591f\u7684\u7279\u6743\u7ea7\u522b\uff0c\u6b64\u65f6\u7b2c\u56db\u4e2a\u53c2\u6570\u4f1a\u88ab\u5ffd\u7565<\/li>\n<li><strong>IPC_INFO<\/strong>(Linux-specific)\u8fd4\u56de\u7cfb\u7edf\u5bf9\u4fe1\u53f7\u91cf\u96c6\u7684\u9650\u5236\u5230__buf\u6307\u5411\u7684\u7ed3\u6784\u4f53seminfo\u4e2d<\/li>\n<\/ul>\n<pre><code class=\"hljs cpp\"><span class=\"hljs-comment\">\/\/_GNU_SOURCE<\/span>\r\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span>  <span class=\"hljs-title\">seminfo<\/span> {<\/span>\r\n    <span class=\"hljs-keyword\">int<\/span>     semmap;     <span class=\"hljs-comment\">\/* Number of entries in semaphore map; unused within kernel *\/<\/span>\r\n    <span class=\"hljs-keyword\">int<\/span>     semmni;     <span class=\"hljs-comment\">\/* Maximum number of semaphore sets *\/<\/span>\r\n    <span class=\"hljs-keyword\">int<\/span>     semmns;     <span class=\"hljs-comment\">\/* Maximum number of semaphores in all semaphore sets *\/<\/span>\r\n    <span class=\"hljs-keyword\">int<\/span>     semmnu;     <span class=\"hljs-comment\">\/* System-wide maximum number of undo structures; unused within kernel *\/<\/span>\r\n    <span class=\"hljs-keyword\">int<\/span>     semmsl;     <span class=\"hljs-comment\">\/* Maximum number of semaphores in a set *\/<\/span>\r\n    <span class=\"hljs-keyword\">int<\/span>     semopm;     <span class=\"hljs-comment\">\/* Maximum number of operations for  semop(2) *\/<\/span>\r\n    <span class=\"hljs-keyword\">int<\/span>     semume;     <span class=\"hljs-comment\">\/* Maximum number of undo entries per process; unused within kernel *\/<\/span>\r\n    <span class=\"hljs-keyword\">int<\/span>     semusz;     <span class=\"hljs-comment\">\/* Size of struct sem_undo *\/<\/span>\r\n        <span class=\"hljs-keyword\">int<\/span>     semvmx;     <span class=\"hljs-comment\">\/* Maximum semaphore value *\/<\/span>\r\n    <span class=\"hljs-keyword\">int<\/span>     semaem;     <span class=\"hljs-comment\">\/* Max. value that can be recorded for semaphore adjustment (SEM_UNDO) *\/<\/span>\r\n};\r\n\r\n<span class=\"hljs-comment\">\/\/semmsl, semmns, semopm, semmni\u53ef\u4ee5\u901a\u8fc7\/proc\/sys\/kernel\/sem\u6765\u8bbe\u7f6e<\/span><\/code><\/pre>\n<ul>\n<li><strong>SEM_INFO<\/strong>\u00a0(Linux-specific)\u8fd4\u56de\u548cIPC_INFO\u4e00\u6837\u7684\u4fe1\u606f\uff0c\u9664\u4e86\u4ee5\u4e0b\u65b9\u9762\uff1asemusz\u6210\u5458\u8fd4\u56de\u5f53\u524d\u7cfb\u7edf\u4e2d\u5b58\u5728\u7684\u4fe1\u53f7\u91cf\u96c6\u7684\u6570\u76ee\uff0csemaem\u8fd4\u56de\u7cfb\u7edf\u4e2d\u6240\u6709\u4fe1\u53f7\u91cf\u96c6\u4e2d\u7684\u4fe1\u53f7\u91cf\u603b\u6570<\/li>\n<li><strong>SEM_STAT<\/strong>(Linux-specific)\u8fd4\u56desemid_ds\u7ed3\u6784\uff0c\u7c7b\u4f3c\u4e0eIPC_STAT<\/li>\n<li><strong>GETALL<\/strong>\u00a0\u8fd4\u56de\u6240\u6709\u4fe1\u53f7\u91cf\u7684semval\u5230arg.array\u4e2d\uff0c\u5ffd\u7565semnum<\/li>\n<li><strong>GETNCNT<\/strong>\u00a0\u8fd4\u56de\u4fe1\u53f7\u91cf\u96c6\u7b2csemnum\u4e2a\u4fe1\u53f7\u91cf\u7684semcnt\u503c<\/li>\n<li><strong>GETPID<\/strong>\u00a0\u8fd4\u56de\u4fe1\u53f7\u91cf\u96c6\u7b2csemnum\u4e2a\u4fe1\u53f7\u91cf\u7684sempid\u503c<\/li>\n<li><strong>GETVAL<\/strong>\u00a0\u8fd4\u56de\u4fe1\u53f7\u91cf\u96c6\u7b2csemnum\u4e2a\u4fe1\u53f7\u91cf\u7684semval\u503c<\/li>\n<li><strong>GETZCNT<\/strong>\u00a0\u8fd4\u56de\u4fe1\u53f7\u91cf\u96c6\u7b2csemnum\u4e2a\u4fe1\u53f7\u91cf\u7684semzcnt\u503c<\/li>\n<li><strong>SETALL<\/strong>\u00a0\u4f7f\u7528arg.array\u8bbe\u7f6e\u4fe1\u53f7\u91cf\u96c6\u91cc\u7684\u6240\u6709\u7684\u4fe1\u53f7\u91cf\u7684semval\u503c\uff0c\u540c\u65f6\u66f4\u65b0\u4fe1\u53f7\u91cf\u96c6\u7684semid_ds\u7ed3\u6784\u4f53\u7684sem_ctime\u6210\u5458\u7684\u503c<\/li>\n<li><strong>SETVAL<\/strong>\u8fd4\u56de\u4fe1\u53f7\u91cf\u96c6\u7b2csemnum\u4e2a\u4fe1\u53f7\u91cf\u7684semval\u7684\u503c\u5230arg.val\u4e2d\uff0c\u540c\u65f6\u66f4\u65b0\u4fe1\u53f7\u91cf\u96c6\u7684semid_ds\u7ed3\u6784\u4f53\u7684sem_ctime\u6210\u5458\u7684\u503c<\/li>\n<\/ul>\n<p><strong>the fourth argument<\/strong>:<\/p>\n<pre><code class=\"hljs cpp\"><span class=\"hljs-keyword\">union<\/span> semun {\r\n    <span class=\"hljs-keyword\">int<\/span>              val;   <span class=\"hljs-comment\">\/* Value for SETVAL *\/<\/span>\r\n    <span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">semid_ds<\/span>* <span class=\"hljs-title\">buf<\/span>;<\/span>   <span class=\"hljs-comment\">\/* Buffer for IPC_STAT, IPC_SET *\/<\/span>\r\n    <span class=\"hljs-keyword\">unsigned<\/span> <span class=\"hljs-keyword\">short<\/span>* <span class=\"hljs-built_in\">array<\/span>;  <span class=\"hljs-comment\">\/* Array for GETALL, SETALL *\/<\/span>\r\n    <span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">seminfo<\/span>* __<span class=\"hljs-title\">buf<\/span>;<\/span>  <span class=\"hljs-comment\">\/* Buffer for IPC_INFO(Linux-specific) *\/<\/span>\r\n};\r\n\r\n<span class=\"hljs-comment\">\/\/&lt;sys\/sem.h&gt;<\/span>\r\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">semid_ds<\/span> {<\/span>\r\n    <span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">ipc_perm<\/span> <span class=\"hljs-title\">sem_perm<\/span>;<\/span>   <span class=\"hljs-comment\">\/* Ownership and permissions *\/<\/span>\r\n    <span class=\"hljs-keyword\">time_t<\/span>          sem_otime;  <span class=\"hljs-comment\">\/* Last semop time *\/<\/span>\r\n    <span class=\"hljs-keyword\">time_t<\/span>          sem_ctime;  <span class=\"hljs-comment\">\/* Last change time *\/<\/span>\r\n    <span class=\"hljs-keyword\">unsigned<\/span> <span class=\"hljs-keyword\">short<\/span>  sem_nsems;  <span class=\"hljs-comment\">\/* No. of semaphores in set *\/<\/span>\r\n};\r\n\r\n<span class=\"hljs-comment\">\/\/&lt;sys\/ipc.h&gt;<\/span>\r\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">ipc_perm<\/span> {<\/span>\r\n    <span class=\"hljs-keyword\">key_t<\/span>           __key;  <span class=\"hljs-comment\">\/* Key supplied to semget(2) *\/<\/span>\r\n    <span class=\"hljs-keyword\">uid_t<\/span>           uid;    <span class=\"hljs-comment\">\/* Effective UID of owner *\/<\/span>\r\n    <span class=\"hljs-keyword\">gid_t<\/span>           gid;    <span class=\"hljs-comment\">\/* Effective GID of owner *\/<\/span>\r\n    <span class=\"hljs-keyword\">uid_t<\/span>           cuid;   <span class=\"hljs-comment\">\/* Effective UID of creator *\/<\/span>\r\n    <span class=\"hljs-keyword\">gid_t<\/span>           cgid;   <span class=\"hljs-comment\">\/* Effective GID of creator *\/<\/span>\r\n    <span class=\"hljs-keyword\">unsigned<\/span> <span class=\"hljs-keyword\">short<\/span>  mode;   <span class=\"hljs-comment\">\/* Permissions *\/<\/span>\r\n    <span class=\"hljs-keyword\">unsigned<\/span> <span class=\"hljs-keyword\">short<\/span>  __seq;  <span class=\"hljs-comment\">\/* Sequence number *\/<\/span>\r\n};<\/code><\/pre>\n<pre><code class=\"hljs awk\">int res=semctl(semid,<span class=\"hljs-number\">0<\/span>,SETVAL,<span class=\"hljs-number\">5<\/span>);\r\n<span class=\"hljs-keyword\">if<\/span>(-<span class=\"hljs-number\">1<\/span>==res)\r\n    perror(<span class=\"hljs-string\">\"semctl\"<\/span>),<span class=\"hljs-keyword\">exit<\/span>(-<span class=\"hljs-number\">1<\/span>);\r\nint res=semctl(semid,<span class=\"hljs-number\">0<\/span>,IPC_RMID);\r\n<span class=\"hljs-keyword\">if<\/span>(-<span class=\"hljs-number\">1<\/span>==res)\r\n    perror(<span class=\"hljs-string\">\"semctl\"<\/span>),<span class=\"hljs-keyword\">exit<\/span>(-<span class=\"hljs-number\">1<\/span>);<\/code><\/pre>\n<h2 id=\"semop\">semop():<\/h2>\n<pre><code class=\"hljs verilog\"><span class=\"hljs-comment\">\/\/\u64cd\u4f5c\u6307\u5b9a\u7684\u4fe1\u53f7\u91cf\u96c6\uff0c\u6210\u529f\u8fd4\u56de0,\u5931\u8d25\u8fd4\u56de-1\u8bbeerrno<\/span>\r\n<span class=\"hljs-keyword\">int<\/span> semop(<span class=\"hljs-keyword\">int<\/span> semid, <span class=\"hljs-keyword\">struct<\/span> sembuf *sops, <span class=\"hljs-keyword\">unsigned<\/span> nsops);<\/code><\/pre>\n<p><strong>semid<\/strong>:\u4fe1\u53f7\u96c6\u7684ID(returned by semget())<br \/>\n<strong>sops<\/strong>:\u7ed3\u6784\u4f53\u6307\u9488, \u65e2\u53ef\u4ee5\u6307\u5411\u7ed3\u6784\u4f53\u53d8\u91cf, \u4e5f\u53ef\u4ee5\u6307\u5411\u7ed3\u6784\u4f53\u6570\u7ec4\uf0e8\u4fe1\u53f7\u91cf\u96c6\u672c\u8d28\u4e0a\u662f\u82e5\u5e72\u4e2a\u4fe1\u53f7\u91cf\u7684\u96c6\u5408, \u53ef\u4ee5\u5b9e\u73b0\u5bf9\u4fe1\u53f7\u91cf\u7684\u6279\u5904\u7406<\/p>\n<pre><code class=\"hljs cpp\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">sembuf<\/span>{<\/span>\r\n    <span class=\"hljs-keyword\">unsigned<\/span> <span class=\"hljs-keyword\">short<\/span>  sem_num;    <span class=\"hljs-comment\">\/\/\u4fe1\u53f7\u91cf\u96c6\u7684\u4e0b\u6807<\/span>\r\n    <span class=\"hljs-keyword\">short<\/span>           sem_op;     <span class=\"hljs-comment\">\/\/\u6b63\u6570\u8868\u793a\u589e\u52a0, 0\u8868\u793a\u4e0d\u53d8, \u8d1f\u6570\u8868\u793a\u51cf\u5c0f<\/span>\r\n    <span class=\"hljs-keyword\">short<\/span>           sem_flg;    <span class=\"hljs-comment\">\/\/\u64cd\u4f5c\u6807\u5fd7,\u9ed8\u8ba4\u7ed90<\/span>\r\n}<\/code><\/pre>\n<p><strong>nsops<\/strong>:\u7ed3\u6784\u4f53\u6307\u9488\u6307\u5411\u7684\u5143\u7d20\u4e2a\u6570, \u4e5f\u5c31\u662f\u6570\u7ec4\u7684\u5927\u5c0f<\/p>\n<h2 id=\"\u4f8b\u5b50\">\u4f8b\u5b50<\/h2>\n<pre><code class=\"hljs awk\">Sys V IPC sem\r\n<span class=\"hljs-comment\">#include&lt;unistd.h&gt;<\/span>\r\n<span class=\"hljs-comment\">#include&lt;sys\/types.h&gt;<\/span>\r\n<span class=\"hljs-comment\">#include&lt;sys\/ipc.h&gt;<\/span>\r\n<span class=\"hljs-comment\">#include&lt;sys\/sem.h&gt;<\/span>\r\n<span class=\"hljs-comment\">#include&lt;signal.h&gt;<\/span>\r\n<span class=\"hljs-comment\">#include&lt;stdio.h&gt;<\/span>\r\n<span class=\"hljs-comment\">#include&lt;stdlib.h&gt;<\/span>\r\nint main(){\r\n    <span class=\"hljs-regexp\">\/\/g<\/span>et key\r\n    key_t key=ftok(<span class=\"hljs-string\">\".\"<\/span>,<span class=\"hljs-number\">200<\/span>);\r\n    <span class=\"hljs-keyword\">if<\/span>(-<span class=\"hljs-number\">1<\/span>==key)\r\n        perror(<span class=\"hljs-string\">\"ftok\"<\/span>),<span class=\"hljs-keyword\">exit<\/span>(-<span class=\"hljs-number\">1<\/span>);\r\n    printf(<span class=\"hljs-string\">\"key=%d\\n\"<\/span>,key);\r\n    <span class=\"hljs-regexp\">\/\/<\/span>create sem\r\n    int semid=semget(key,<span class=\"hljs-number\">0<\/span>,<span class=\"hljs-number\">0<\/span>);\r\n    <span class=\"hljs-keyword\">if<\/span>(-<span class=\"hljs-number\">1<\/span>==semid)\r\n        perror(<span class=\"hljs-string\">\"semget\"<\/span>),<span class=\"hljs-keyword\">exit<\/span>(-<span class=\"hljs-number\">1<\/span>);\r\n    printf(<span class=\"hljs-string\">\"semid=%d\\n\"<\/span>,semid);\r\n    <span class=\"hljs-regexp\">\/\/<\/span>creat <span class=\"hljs-number\">10<\/span> children to take the shared resource\r\n    int i=<span class=\"hljs-number\">0<\/span>;\r\n    <span class=\"hljs-keyword\">for<\/span>(i=<span class=\"hljs-number\">0<\/span>;i&lt;<span class=\"hljs-number\">10<\/span>;i++){      <span class=\"hljs-regexp\">\/\/<\/span>\u521b\u5efa<span class=\"hljs-number\">10<\/span>\u4e2a\u8fdb\u7a0b, \u5f53\u7136,\u9700\u8981\u53ea\u7ed9parent\u6216child\u5355\u72ecfork(), \u5426\u5219\u5c31\u662f<span class=\"hljs-number\">2<\/span>^<span class=\"hljs-number\">10<\/span>\u4e2a\u8fdb\u7a0b\r\n        pid_t pid=fork();\r\n        <span class=\"hljs-keyword\">if<\/span>(-<span class=\"hljs-number\">1<\/span>==pid)\r\n            perror(<span class=\"hljs-string\">\"fork\"<\/span>),<span class=\"hljs-keyword\">exit<\/span>(-<span class=\"hljs-number\">1<\/span>);\r\n        <span class=\"hljs-keyword\">if<\/span>(<span class=\"hljs-number\">0<\/span>==pid){\r\n\r\n            struct sembuf buf;      <span class=\"hljs-regexp\">\/\/<\/span>\u51c6\u5907\u5360\u7528\u8d44\u6e90, sem_op-<span class=\"hljs-number\">1<\/span>\r\n            buf.sem_num=<span class=\"hljs-number\">0<\/span>;      <span class=\"hljs-regexp\">\/\/<\/span>\u4fe1\u53f7\u91cf\u96c6\u4e0b\u6807\r\n            buf.sem_op=-<span class=\"hljs-number\">1<\/span>;      <span class=\"hljs-regexp\">\/\/<\/span>\u4fe1\u53f7\u91cf-<span class=\"hljs-number\">1<\/span>\r\n            buf.sem_flg=<span class=\"hljs-number\">0<\/span>;      <span class=\"hljs-regexp\">\/\/<\/span>\u64cd\u4f5c\u6807\u5fd7\r\n            int res=semop(semid,&amp;buf,<span class=\"hljs-number\">1<\/span><span class=\"hljs-regexp\">\/*\u7ed3\u6784\u4f53\u53d8\u91cf\u7684\u4e2a\u6570*\/<\/span>);\r\n            <span class=\"hljs-keyword\">if<\/span>(-<span class=\"hljs-number\">1<\/span>==res)\r\n                perror(<span class=\"hljs-string\">\"semop\"<\/span>),<span class=\"hljs-keyword\">exit<\/span>(-<span class=\"hljs-number\">1<\/span>);\r\n\r\n            sleep(<span class=\"hljs-number\">20<\/span>);          <span class=\"hljs-regexp\">\/\/<\/span>\u6a21\u62df\u6b63\u5728\u5360\u7528\u5171\u4eab\u8d44\u6e90\r\n\r\n            buf.sem_op=<span class=\"hljs-number\">1<\/span>;       <span class=\"hljs-regexp\">\/\/<\/span>\u5360\u7528\u5b8c\u4e86, sem_op+<span class=\"hljs-number\">1<\/span>\r\n            res=semop(semid,&amp;buf,<span class=\"hljs-number\">1<\/span>);\r\n            <span class=\"hljs-keyword\">if<\/span>(-<span class=\"hljs-number\">1<\/span>==res)\r\n                perror(<span class=\"hljs-string\">\"semop\"<\/span>),<span class=\"hljs-keyword\">exit<\/span>(-<span class=\"hljs-number\">1<\/span>);\r\n\r\n            <span class=\"hljs-keyword\">exit<\/span>(<span class=\"hljs-number\">0<\/span>);                <span class=\"hljs-regexp\">\/\/<\/span>\u7ec8\u6b62\u5b50\u8fdb\u7a0b, \u81ea\u7136\u4e5f\u5c31\u8df3\u51fa\u4e86\u5faa\u73af,\u9632\u6b62\u518dfork()\r\n        <span class=\"hljs-regexp\">\/\/<\/span>  <span class=\"hljs-keyword\">break<\/span>;\r\n        }\r\n    }   \r\n    return <span class=\"hljs-number\">0<\/span>;\r\n}\r\n<span class=\"hljs-regexp\">\/\/<\/span>\u51fa\u73b0\u62a2\u5360\u7684\u6548\u679c, \u8fd8\u6ca1\u6709\u5168\u90e8\u91ca\u653e\u5b8c\u6bd5\u7684\u65f6\u5019\u5c31\u6709\u8fdb\u7a0b\u62a2\u5230\u4e86\u5df2\u7ecf\u91ca\u653e\u7684\u8fdb\u7a0b<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u8cc7\u6599\u4f86\u6e90\uff1ahttps:\/\/www.cnblogs.com\/xiaojiang1025\/p\/5936135.ht<span class=\"post-excerpt-end\">&hellip;<\/span><\/p>\n<p class=\"more-link\"><a href=\"https:\/\/learn-house.idv.tw\/?p=2592\" class=\"themebutton\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-2592","post","type-post","status-publish","format-standard","hentry","category-5"],"_links":{"self":[{"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/2592","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2592"}],"version-history":[{"count":0,"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/2592\/revisions"}],"wp:attachment":[{"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2592"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2592"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2592"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}