亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 11.html

?? 介紹linux下文件和設備編程
?? HTML
?? 第 1 頁 / 共 5 頁
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD>   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">   <META NAME="GENERATOR" CONTENT="《良友》v2.1, 作者:安富國,http://winking.126.com">   <TITLE>進程和線程編程</TITLE></HEAD><BODY style="font-family: 宋體; font-size: 9pt">&nbsp;<CENTER><TABLE CELLSPACING=10 CELLPADDING=10 WIDTH="60%" BGCOLOR="#FFB693" ><TR><TD ALIGN=CENTER><FONT SIZE=+2><!--標題由此開始-->進程和線程編程</TD></TR></TABLE></CENTER><p><h3>目       錄</h3><!--目錄由此開始--><A NAME="Content" ID="Content"></A><OL><LI><A HREF="#I236">進程和線程編程</A></LI><OL><LI><A HREF="#I237">原始管道</A></LI><OL><LI><A HREF="#I238">pipe()</A></LI><LI><A HREF="#I239">dup()</A></LI><LI><A HREF="#I240">dup2()</A></LI><LI><A HREF="#I241">popen()和pclose()</A></LI></OL><LI><A HREF="#I242">命名管道</A></LI><OL><LI><A HREF="#I243">創建FIFO</A></LI><LI><A HREF="#I244">操作FIFO</A></LI><LI><A HREF="#I245">阻塞FIFO</A></LI></OL><LI><A HREF="#I246">消息隊列</A></LI><OL><LI><A HREF="#I247">msgget()</A></LI><LI><A HREF="#I248">msgsnd()</A></LI><LI><A HREF="#I249">msgrcv()</A></LI><LI><A HREF="#I250">msgctl()</A></LI></OL><LI><A HREF="#I251">信號量</A></LI><OL><LI><A HREF="#I252">semget()</A></LI><LI><A HREF="#I253">semop()</A></LI><LI><A HREF="#I254">semctl()</A></LI></OL><LI><A HREF="#I255">共享內存</A></LI><OL><LI><A HREF="#I256">shmget()</A></LI><LI><A HREF="#I257">shmat()</A></LI><LI><A HREF="#I258">shmctl()</A></LI><LI><A HREF="#I259">shmdt()</A></LI></OL><LI><A HREF="#I260">線程</A></LI><OL><LI><A HREF="#I261">線程同步</A></LI><LI><A HREF="#I262">使用信號量協調程序</A></LI><LI><A HREF="#I263">代碼例子</A></LI><OL><LI><A HREF="#I264">newthread</A></LI><LI><A HREF="#I265">exitthead</A></LI><LI><A HREF="#I266">getchannel</A></LI><LI><A HREF="#I267">def</A></LI><LI><A HREF="#I268">release</A></LI><LI><A HREF="#I269">redezvous</A></LI><LI><A HREF="#I270">unbouded</A></LI></OL></OL></OL></OL><hr><br><A NAME="I236" ID="I236"></A><center><b><font size=+2>進程和線程編程</font></b></center><br>&nbsp;&nbsp;&nbsp; 看一下UNIX系統中的進程和Mach的任務和線程之間的關系。在UNIX系統中,一個進程包括一個可執行的程序和一系列的資源,例如文件描述符表和地址空間。在Mach中,一個任務僅包括一系列的資源;線程處理所有的可執行代碼。一個Mach的任務可以有任意數目的線程和它相關,同時每個線程必須和某個任務相關。和某一個給定的任務相關的所有線程都共享任務的資源。這樣,一個線程就是一個程序計數器、一個堆棧和一系列的寄存器。所有需要使用的數據結構都屬于任務。一個UNIX系統中的進程在Mach中對應于一個任務和一個單獨的線程。<br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I237" ID="I237"></A><center><b><font size=+2>原始管道</font></b></center><br>&nbsp;&nbsp;&nbsp; 使用C語言創建管道要比在shell下使用管道復雜一些。如果要使用C語言創建一個簡單的管道,可以使用系統調用pipe()。它接受一個參數,也就是一個包括兩個整數的數組。如果系統調用成功,此數組將包括管道使用的兩個文件描述符。創建一個管道之后,一般情況下進程將產生一個新的進程。<p>&nbsp;&nbsp;&nbsp; 可以通過打開兩個管道來創建一個雙向的管道。但需要在子進程中正確地設置文件描述必須在系統調用fork()中調用pipe(),否則子進程將不會繼承文件描述符。當使用半雙工管道時,任何關聯的進程都必須共享一個相關的祖先進程。因為管道存在于系統內核之中,所以任何不在創建管道的進程的祖先進程之中的進程都將無法尋址它。而在命名管道中卻不是這樣。<br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I238" ID="I238"></A><center><b><font size=+2>pipe()</font></b></center><br>系統調用:pipe();<br>原型:intpipe(intfd[2]);<br>返回值:如果系統調用成功,返回0<br>如果系統調用失敗返回-1:errno=EMFILE(沒有空閑的文件描述符)<br>EMFILE(系統文件表已滿)<br>EFAULT(fd數組無效)<br>注意fd[0]用于讀取管道,fd[1]用于寫入管道。<br>#include&lt;stdio.h&gt;<br>#include&lt;unistd.h&gt;<br>#include&lt;sys/types.h&gt;<br>main()<br>{<br>intfd[2];<br>pipe(fd);<br>..<br>}<br>一旦創建了管道,我們就可以創建一個新的子進程:<br>#include&lt;stdio.h&gt;<br>#include&lt;unistd.h&gt;<br>#include&lt;sys/types.h&gt;<br>main()<br>{<br>intfd[2];<br>pid_t childpid;<br>pipe(fd);<br>if((childpid=fork())==-1)<br>{<br>perror(&quot;fork&quot;);<br>exit(1);<br>}..<br>}<p>&nbsp;&nbsp;&nbsp; 如果父進程希望從子進程中讀取數據,那么它應該關閉fd1,同時子進程關閉fd0。反之,如果父進程希望向子進程中發送數據,那么它應該關閉fd0,同時子進程關閉fd1。因為文件描述符是在父進程和子進程之間共享,所以我們要及時地關閉不需要的管道的那一端。單從技術的角度來說,如果管道的一端沒有正確地關閉的話,你將無法得到一個EOF。<p>#include&lt;stdio.h&gt;<br>#include&lt;unistd.h&gt;<br>#include&lt;sys/types.h&gt;<br>main()<br>{<br>intfd[2];<br>pid_t childpid;<br>pipe(fd);<br>if((childpid=fork())==-1)<br>{<br>perror(&quot;fork&quot;);<br>exit(1);<br>}<br>if(childpid==0)<br>{<br>/*Child process closes up in put side of pipe*/<br>close(fd[0]);<br>}<br>else<br>{<br>/*Parent process closes up out put side of pipe*/<br>close(fd[1]);<br>}..<br>}<p>&nbsp;&nbsp;&nbsp; 正如前面提到的,一但創建了管道之后,管道所使用的文件描述符就和正常文件的文件描述符一樣了。<p>#include&lt;stdio.h&gt;<br>#include&lt;unistd.h&gt;<br>#include&lt;sys/types.h&gt;<br>intmain(void)<br>{<br>intfd[2],nbytes;<br>pid_tchildpid;<br>charstring[]=&quot;Hello,world!\n&quot;;<br>charreadbuffer[80];<br>pipe(fd);<br>if((childpid=fork())==-1)<br>{<br>perror(&quot;fork&quot;);<br>exit(1);<br>}<br>if(childpid==0)<br>{<br>/*Child process closes up in put side of pipe*/<br>close(fd[0]);<br>/*Send&quot;string&quot;through the out put side of pipe*/<br>write(fd[1],string,strlen(string));<br>exit(0);<br>}<br>else<br>{<br>/*Parent process closes up out put side of pipe*/<br>close(fd[1]);<br>/*Readinastringfromthepipe*/<br>nbytes=read(fd[0],readbuffer,sizeof(readbuffer));<br>printf(&quot;Receivedstring:%s&quot;,readbuffer);<br>}<br>return(0);<br>}<p>&nbsp;&nbsp;&nbsp; 一般情況下,子進程中的文件描述符將會復制到標準的輸入和輸出中。這樣子進程可以使用exec()執行另一個程序,此程序繼承了標準的數據流。<p><p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I239" ID="I239"></A><center><b><font size=+2>dup()</font></b></center><br>系統調用:dup();<br>原型:intdup(intoldfd);<br>返回:如果系統調用成功,返回新的文件描述符<br>如果系統調用失敗,返回-1:errno=EBADF(oldfd不是有效的文件描述符)<br>EBADF(newfd超出范圍)<br>EMFILE(進程的文件描述符太多)<p>&nbsp;&nbsp;&nbsp; 注意舊文件描述符oldfd沒有關閉。雖然舊文件描述符和新創建的文件描述符可以交換使用,但一般情況下需要首先關閉一個。系統調用dup()使用的是號碼最小的空閑的文件描述符。<p>再看下面的程序:<br>..<br>childpid=fork();<br>if(childpid==0)<br>{<br>/*Close up standard input of the child*/<br>close(0);<br>/*Dup licate the input side of pipe to stdin*/<br>dup(fd[0]);<br>execlp(&quot;sort&quot;,&quot;sort&quot;,NULL);<br>.<br>}<br>&nbsp;&nbsp;&nbsp; 因為文件描述符0(stdin)被關閉,所以dup()把管道的輸入描述符復制到它的標準輸入中。這樣我們可以調用execlp(),使用sort程序覆蓋子進程的正文段。因為新創建的程序從它的父進程中繼承了標準輸入/輸出流,所以它實際上繼承了管道的輸入端作為它的標準輸入端。現在,最初的父進程送往管道的任何數據都將會直接送往sort函數。<p><p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I240" ID="I240"></A><center><b><font size=+2>dup2()</font></b></center><br>系統調用:dup2();<br>原型:intdup2(intoldfd,intnewfd);<br>返回值:如果調用成功,返回新的文件描述符<br>如果調用失敗,返回-1:errno=EBADF(oldfd不是有效的文件描述符)<br>EBADF(newfd超出范圍)<br>EMFILE(進程的文件描述符太多)<br>注意dup2()將關閉舊文件描述符。<p>&nbsp;&nbsp;&nbsp; 使用此系統調用,可以將close操作和文件描述符復制操作集成到一個系統調用中。另外,此系統調用保證了操作的自動進行,也就是說操作不能被其他的信號中斷。這個操作將會在返回系統內核之前完成。如果使用前一個系統調用dup(),程序員不得不在此之前執行一個close()操作。請看下面的程序:<br>..<p>childpid=fork();<br>if(childpid==0)<br>{<br>/*Close stdin,dup licate the input side of pipe to stdin*/<br>dup2(0,fd[0]);<br>execlp(&quot;sort&quot;,&quot;sort&quot;,NULL);<br>..<br>}<p><p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I241" ID="I241"></A><center><b><font size=+2>popen()和pclose()</font></b></center><br>如果你認為上面創建和使用管道的方法過于繁瑣的話,你也可以使用下面的簡單的方法:<p>庫函數:popen()和pclose();<br>原型:FILE*popen(char*command,char*type);<br>返回值:如果成功,返回一個新的文件流。<br>如果無法創建進程或者管道,返回NULL。<br>&nbsp;&nbsp;&nbsp; 此標準的庫函數通過在系統內部調用pipe()來創建一個半雙工的管道,然后它創建一個子進程,啟動shell,最后在shell上執行command參數中的命令。管道中數據流的方向是由第二個參數type控制的。此參數可以是r或者w,分別代表讀或寫。但不能同時為讀和寫。在Linux系統下,管道將會以參數type中第一個字符代表的方式打開。所以,如果你在參數type中寫入rw,管道將會以讀的方式打開。<p>&nbsp;&nbsp;&nbsp; 雖然此庫函數的用法很簡單,但也有一些不利的地方。例如它失去了使用系統調用pipe()時可以有的對系統的控制。盡管這樣,因為可以直接地使用shell命令,所以shell中的一些通配符和其他的一些擴展符號都可以在command參數中使用。<br>使用popen()創建的管道必須使用pclose()關閉。其實,popen/pclose和標準文件輸入/輸出流中的fopen()/fclose()十分相似。<p><br>庫函數:pclose();<br>原型:intpclose(FILE*stream);<br>返回值:返回系統調用wait4()的狀態。<br>如果stream無效,或者系統調用wait4()失敗,則返回-1。<br>&nbsp;&nbsp;&nbsp; 注意此庫函數等待管道進程運行結束,然后關閉文件流。庫函數pclose()在使用popen()創建的進程上執行wait4()函數。當它返回時,它將破壞管道和文件系統。<br>&nbsp;&nbsp;&nbsp; 在下面的例子中,用sort命令打開了一個管道,然后對一個字符數組排序:<p>#include&lt;stdio.h&gt;<br>#defineMAXSTRS5<br>intmain(void)<br>{<br>intcntr;<br>FILE*pipe_fp;<br>char*strings[MAXSTRS]={&quot;echo&quot;,&quot;bravo&quot;,&quot;alpha&quot;,<br>&quot;charlie&quot;,&quot;delta&quot;};<br>/*Createonewaypipelinewithcalltopopen()*/<br>if((pipe_fp=popen(&quot;sort&quot;,&quot;w&quot;))==NULL)<br>{<br>perror(&quot;popen&quot;);<br>exit(1);<br>}<br>/*Processingloop*/<br>for(cntr=0;cntr&lt;MAXSTRS;cntr++){<br>fputs(strings[cntr],pipe_fp);<br>fputc('\n',pipe_fp);<br>}<br>/*Closethepipe*/<br>pclose(pipe_fp);<br>return(0);<br>}<br>因為popen()使用shell執行命令,所以所有的shell擴展符和通配符都可以使用。此外,它還可以和popen()一起使用重定向和輸出管道函數。再看下面的例子:<br>popen(&quot;ls~scottb&quot;,&quot;r&quot;);<br>popen(&quot;sort&gt;/tmp/foo&quot;,&quot;w&quot;);<br>popen(&quot;sort|uniq|more&quot;,&quot;w&quot;);<br>下面的程序是另一個使用popen()的例子,它打開兩個管道(一個用于ls命令,另一個用于<br>sort命令):<br>#include&lt;stdio.h&gt;<br>intmain(void)<br>{<br>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91性感美女视频| 国产精品久久久久影院亚瑟| 中文字幕欧美三区| 亚洲不卡av一区二区三区| 不卡的av在线播放| 日韩欧美在线观看一区二区三区| 亚洲欧美一区二区三区极速播放 | 亚洲人成在线播放网站岛国| 久久精品国产99久久6| 欧美色国产精品| 亚洲三级在线看| 国产不卡视频在线观看| 日韩欧美国产午夜精品| 午夜精品一区二区三区三上悠亚 | 国产精品一区久久久久| 91麻豆精品久久久久蜜臀| 亚洲香肠在线观看| 色88888久久久久久影院按摩 | 欧美精品一区二区三区很污很色的 | 色爱区综合激月婷婷| 国产精品美女久久久久久久网站| 美腿丝袜亚洲色图| 91精品福利在线一区二区三区| 一区二区三区在线高清| 亚洲精品视频免费观看| 精品国产乱码久久久久久1区2区 | 久久精品免费在线观看| 国产综合一区二区| 久久久亚洲精品一区二区三区| 美女被吸乳得到大胸91| 欧美一级夜夜爽| 六月丁香综合在线视频| 精品国产自在久精品国产| 久久不见久久见免费视频7| 久久综合久久鬼色中文字| 国产一区三区三区| 欧美激情一区二区三区不卡| 国产成人鲁色资源国产91色综| 日本一二三不卡| 99久久免费视频.com| 伊人夜夜躁av伊人久久| 88在线观看91蜜桃国自产| 男男视频亚洲欧美| 国产亚洲短视频| 91麻豆成人久久精品二区三区| 亚洲激情网站免费观看| 欧美精品一二三| 国产一区二区不卡| 亚洲猫色日本管| 欧美丰满一区二区免费视频 | 亚洲成精国产精品女| 欧美一级夜夜爽| 国产成人精品免费看| 亚洲精品国产成人久久av盗摄| 欧美影视一区在线| 久久精品国产77777蜜臀| 欧美国产丝袜视频| 欧美另类高清zo欧美| 国产一区在线看| 亚洲图片欧美综合| 久久久久亚洲综合| 色婷婷久久久久swag精品| 奇米影视7777精品一区二区| 中文字幕精品三区| 6080日韩午夜伦伦午夜伦| 国产成人av一区二区| 亚洲1区2区3区4区| 国产精品色婷婷久久58| 777奇米成人网| av亚洲精华国产精华| 日本美女视频一区二区| 亚洲四区在线观看| 精品成人免费观看| 欧美探花视频资源| 丁香天五香天堂综合| 香蕉影视欧美成人| 国产精品卡一卡二| 欧美电影免费提供在线观看| 色综合色综合色综合色综合色综合 | 91同城在线观看| 久久精品av麻豆的观看方式| 一区二区三区在线高清| 国产精品美女久久久久aⅴ国产馆| 欧美高清精品3d| 色呦呦国产精品| 国产成人h网站| 精品一区二区三区影院在线午夜| 亚洲综合在线五月| 国产欧美一区二区三区鸳鸯浴| 欧美一级二级三级乱码| 欧美性淫爽ww久久久久无| 99久久99久久精品国产片果冻 | 91视视频在线直接观看在线看网页在线看| 日韩精品三区四区| 亚洲午夜一区二区| 国产精品白丝在线| 久久久久久久久久久99999| 91精品国产麻豆| 欧美日本一区二区三区| 色琪琪一区二区三区亚洲区| 成人h精品动漫一区二区三区| 韩国欧美国产1区| 麻豆91在线播放免费| 日韩精品一级中文字幕精品视频免费观看 | 色综合中文字幕国产 | 国产成人精品免费网站| 国产一区视频网站| 国产精品一区免费视频| 国产精品资源在线看| 国产成人8x视频一区二区| 国产一区二区三区在线观看精品| 久久99国产精品久久| 日韩制服丝袜av| 免费国产亚洲视频| 久久99日本精品| 国产成人免费视频网站| 成人午夜又粗又硬又大| 91视频一区二区三区| 欧美性色欧美a在线播放| 欧美日韩专区在线| 日韩一区二区三区免费观看 | 欧美肥胖老妇做爰| 在线不卡免费欧美| 精品日韩一区二区| 国产欧美日韩在线| 亚洲女子a中天字幕| 亚洲一区二区视频在线观看| 视频在线在亚洲| 国产精品中文有码| 不卡av电影在线播放| 91九色最新地址| 欧美一区二区三区四区久久| 久久无码av三级| 亚洲丝袜美腿综合| 免费人成黄页网站在线一区二区| 国产一区二区三区四| 99久久伊人精品| 欧美乱妇15p| 日本一区二区三区视频视频| 亚洲影视在线播放| 国产乱码精品1区2区3区| 91日韩精品一区| 欧美一区二区免费观在线| 国产亚洲女人久久久久毛片| 一区二区三区免费| 黄色小说综合网站| 欧美自拍偷拍午夜视频| 久久久久久日产精品| 亚洲一区二区av在线| 国产在线视频不卡二| 91极品美女在线| 精品国产99国产精品| 亚洲资源在线观看| 国产精品亚洲а∨天堂免在线| 在线亚洲一区二区| 久久久美女艺术照精彩视频福利播放| 亚洲丝袜美腿综合| 国产酒店精品激情| 欧美剧情电影在线观看完整版免费励志电影 | 国产精品影音先锋| 欧洲激情一区二区| 中文字幕国产精品一区二区| 婷婷综合五月天| 99国产精品99久久久久久| 欧美大度的电影原声| 日韩色在线观看| 亚洲在线视频免费观看| 国产成人av电影在线| 日韩美女一区二区三区四区| 亚洲与欧洲av电影| 97精品国产97久久久久久久久久久久| 精品国产一区二区三区久久影院| 一二三区精品福利视频| 成人av网站大全| 久久久精品人体av艺术| 日韩成人一区二区| 欧美日韩精品一二三区| 亚洲猫色日本管| 93久久精品日日躁夜夜躁欧美| 久久久噜噜噜久久人人看| 久久国产精品99久久人人澡| 欧美精品一级二级三级| 亚洲第一主播视频| 日本韩国精品在线| 1区2区3区精品视频| 色婷婷狠狠综合| 国产精品蜜臀在线观看| 丰满少妇久久久久久久| 久久尤物电影视频在线观看| 久久91精品国产91久久小草| 欧美一区二区成人| 人禽交欧美网站| 日韩一区二区三区观看| 另类小说一区二区三区| 日韩欧美亚洲国产精品字幕久久久| 蜜臀av一区二区在线观看| 欧美变态口味重另类| 精品一区二区av| 久久精品欧美一区二区三区不卡 | 中文字幕日韩av资源站|