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

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

?? 11.html

?? 介紹linux下文件和設備編程
?? HTML
?? 第 1 頁 / 共 5 頁
字號:
union semunsemopts;<br>semopts.val=initval;<br>semctl(sid,semnum,SETVAL,semopts);<br>}<p>&nbsp;&nbsp;&nbsp; 注意系統(tǒng)調用semctl中的最后一個參數是一個聯(lián)合類型的副本,而不是一個指向聯(lián)合類型的指針。<p><p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I255" ID="I255"></A><center><b><font size=+2>共享內存</font></b></center><br>&nbsp;&nbsp;&nbsp; 共享內存就是由幾個進程共享一段內存區(qū)域。這可以說是最快的IPC形式,因為它無須任何的中間操作(例如,管道、消息隊列等)。它只是把內存段直接映射到調用進程的地址空間中。這樣的內存段可以是由一個進程創(chuàng)建的,然后其他的進程可以讀寫此內存段。<p>&nbsp;&nbsp;&nbsp; 每個系統(tǒng)的共享內存段在系統(tǒng)內核中也保持著一個內部的數據結構shmid_ds。此數據結構是在linux/shm.h中定義的,如下所示:<p>/* One shmid data structure for each shared memory segment in the system. */<br>struct shmid_ds {<br>struct ipc_perm shm_perm; /* operation perms */<br>int shm_segsz; /* size of segment (bytes) */<br>time_t shm_atime; /* last attach time */<br>time_t shm_dtime; /* last detach time */<br>time_t shm_ctime; /* last change time */<br>unsigned short shm_cpid; /* pid of creator */<br>unsigned short shm_lpid; /* pid of last operator */<br>short shm_nattch; /* no. of current attaches */<br>/* the following are private */<br>unsigned short shm_npages; /* size of segment (pages) */<br>unsigned long *shm_pages; /* array of ptrs to frames -&gt; SHMMAX */<br>struct vm_area_struct *attaches; /* descriptors for attaches */<br>};<p>shm_perm 是數據結構ipc_perm的一個實例。這里保存的是內存段的存取權限,和其他的有關內存段創(chuàng)建者的信息。<br>shm_segsz 內存段的字節(jié)大小。<br>shm_atime 最后一個進程存取內存段的時間。<br>shm_dtime 最后一個進程離開內存段的時間。<br>shm_ctime 內存段最后改動的時間。<br>shm_cpid 內存段創(chuàng)建進程的P I D。<br>shm_lpid 最后一個使用內存段的進程的P I D。<br>shm_nattch 當前使用內存段的進程總數。<br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I256" ID="I256"></A><center><b><font size=+2>shmget()</font></b></center><br>系統(tǒng)調用:shmget();<br>原型:int shmget(key_t key,int size,int shmflg);<br>返回值:如果成功,返回共享內存段標識符。如果失敗,則返回-1:errno=EINVAL(無效的內存段大小)<br>EEXIST(內存段已經存在,無法創(chuàng)建)<br>EIDRM(內存段已經被刪除)<br>ENOENT(內存段不存在)<br>EACCES(權限不夠)<br>ENOMEM(沒有足夠的內存來創(chuàng)建內存段)<p>&nbsp;&nbsp;&nbsp; 系統(tǒng)調用shmget()中的第一個參數是關鍵字值(它是用系統(tǒng)調用ftok()返回的)。其他的操作都要依據shmflg中的命令進行。<br>&nbsp;&nbsp;&nbsp; &middot;IPC_CREAT如果系統(tǒng)內核中沒有共享的內存段,則創(chuàng)建一個共享的內存段。<br>&nbsp;&nbsp;&nbsp; &middot;IPC_EXCL當和IPC_CREAT一同使用時,如果共享內存段已經存在,則調用失敗。<br>&nbsp;&nbsp;&nbsp; 當IPC_CREAT單獨使用時,系統(tǒng)調用shmget()要么返回一個新創(chuàng)建的共享內存段的標識符,要么返回一個已經存在的共享內存段的關鍵字值。如果IPC_EXCL和IPC_CREAT一同使用,則要么系統(tǒng)調用新創(chuàng)建一個共享的內存段,要么返回一個錯誤值-1。IPC_EXCL單獨使用沒有意義。<p>&nbsp;&nbsp;&nbsp; 下面是一個定位和創(chuàng)建共享內存段的程序:<p>int open_segment(key_t keyval,int segsize)<br>{<br>int shmid;<br>if((shmid=shmget(keyval,segsize,IPC_CREAT|0660))==-1)<br>{<br>return(-1);<br>}<br>return(shmid);<br>}<p>&nbsp;&nbsp;&nbsp; 一旦一個進程擁有了一個給定的內存段的有效IPC標識符,它的下一步就是將共享的內存段映射到自己的地址空間中。<p><p><p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I257" ID="I257"></A><center><b><font size=+2>shmat()</font></b></center><br>系統(tǒng)調用: shmat();<br>原型:int shmat ( int shmid, char *shmaddr, int shmflg);<br>返回值:如果成功,則返回共享內存段連接到進程中的地址。如果失敗,則返回- 1:errno = EINVAL (無效的IPC ID 值或者無效的地址)<br>ENOMEM (沒有足夠的內存)<br>EACCES (存取權限不夠)<p>&nbsp;&nbsp;&nbsp; 如果參數a d d r的值為0,那么系統(tǒng)內核則試圖找出一個沒有映射的內存區(qū)域。我們推薦使用這種方法。你可以指定一個地址,但這通常是為了加快對硬件設備的存取,或者解決和其他程序的沖突。<br>&nbsp;&nbsp;&nbsp; 下面的程序中的調用參數是一個內存段的I P C標識符,返回內存段連接的地址:<p>char *attach_segment(int shmid)<br>{<br>return(shmat(shmid, 0, 0));<br>}<p>&nbsp;&nbsp;&nbsp; 一旦內存段正確地連接到進程以后,進程中就有了一個指向該內存段的指針。這樣,以后就可以使用指針來讀取此內存段了。但一定要注意不能丟失該指針的初值。<p><p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I258" ID="I258"></A><center><b><font size=+2>shmctl()</font></b></center><br>系統(tǒng)調用:shmctl ( ) ;<br>原型:int shmctl( int shmqid, int cmd, struct shmid_ds *buf );<br>返回值: 0 ,如果成功。<br>-1,如果失敗:errno = EACCES (沒有讀的權限,同時命令是IPC_STAT)<br>EFAULT(buf指向的地址無效,同時命令是IPC_SET和IPC_STAT )<br>EIDRM (內存段被移走)<br>EINVAL (shmqid 無效)<br>EPERM (使用IPC_SET 或者IPC_RMID 命令,但調用進程沒有寫的權限)<br>IPC_STAT 讀取一個內存段的數據結構shmid_ds,并將它存儲在buf參數指向的地址中。<br>IPC_SET 設置內存段的數據結構shmid_ds中的元素ipc_perm的值。從參數buf中得到要設置的值。<br>IPC_RMID 標志內存段為移走。<p>&nbsp;&nbsp;&nbsp; 命令IPC_RMID并不真正從系統(tǒng)內核中移走共享的內存段,而是把內存段標記為可移除。進程調用系統(tǒng)調用shmdt()脫離一個共享的內存段。<p><p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I259" ID="I259"></A><center><b><font size=+2>shmdt()</font></b></center><br>系統(tǒng)調用:shmdt();<br>調用原型:int shmdt ( char *shmaddr );<br>返回值:如果失敗,則返回- 1:errno = EINVAL (無效的連接地址)<p>&nbsp;&nbsp;&nbsp; 當一個進程不在需要共享的內存段時,它將會把內存段從其地址空間中脫離。但這不等于將共享內存段從系統(tǒng)內核中移走。當進程脫離成功后,數據結構shmid_ds中元素shm_nattch將減1。當此數值減為0以后,系統(tǒng)內核將物理上把內存段從系統(tǒng)內核中移走。<p><p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I260" ID="I260"></A><center><b><font size=+2>線程</font></b></center><br>&nbsp;&nbsp;&nbsp; 線程通常叫做輕型的進程。雖然這個叫法有些簡單化,但這有利于了解線程的概念。因為線程和進程比起來很小,所以相對來說,線程花費更少的CPU資源。進程往往需要它們自己的資源,但線程之間可以共享資源,所以線程更加節(jié)省內存。Mach的線程使得程序員可以編寫并發(fā)運行的程序,而這些程序既可以運行在單處理器的機器上,也可以運行在多處理器的機器中。另外,在單處理器環(huán)境中,當應用程序執(zhí)行容易引起阻塞和延遲的操作時,線程可以提高效率。<p>&nbsp;&nbsp;&nbsp; 用子函數pthread_create創(chuàng)建一個新的線程。它有四個參數:一個用來保存線程的線程變量、一個線程屬性、當線程執(zhí)行時要調用的函數和一個此函數的參數。例如:<br>pthread_ta_thread ;<br>pthread_attr_ta_thread_attribute ;<br>void thread_function(void *argument);<br>char * some_argument;<br>pthread_create( &amp;a_thread, a_thread_attribute, (void *)&amp;thread_function,<br>(void *) &amp;some_argument);<br>&nbsp;&nbsp;&nbsp; 線程屬性只指明了需要使用的最小的堆棧大小。在以后的程序中,線程的屬性可以指定其他的值,但現在大部分的程序可以使用缺省值。不像UNIX系統(tǒng)中使用fork系統(tǒng)調用創(chuàng)建的進程,它們和它們的父進程使用同一個執(zhí)行點,線程使用在pthread_create中的參數指明要開始執(zhí)行的函數。<p>&nbsp;&nbsp;&nbsp; 現在我們可以編制第一個程序了。我們編制一個多線程的應用程序,在標準輸出中打印“Hello Wo r l d”。首先我們需要兩個線程變量,一個新線程開始執(zhí)行時可以調用的函數。我們還需要指明每一個線程應該打印的信息。一個做法是把要打印的字符串分開,給每一個線程一個字符串作為開始的參數。請看下面的代碼:<br>void print_message_function( void *ptr );<br>main( )<br>{<br>pthread_t thread1, thread2;<br>char *message1 = &quot;Hello&quot;;<br>char *message2 = &quot;Wo r l d &quot; ;<br>pthread_create( &amp;thread1, pthread_attr_default,<br>(void*)&amp;print_message_function, (void*) message1);<br>pthread_create(&amp;thread2, pthread_attr_default,<br>(void*)&amp;print_message_function, (void*) message2);<br>exit( 0 ) ;<br>}<br>void print_message_function( void *ptr )<br>{<br>char *message;<br>message = (char *) ptr;<br>printf(&quot;%s &quot;, message);<br>}<p>&nbsp;&nbsp;&nbsp; 程序通過調用pthread_create創(chuàng)建第一個線程,并將“Hello”作為它的啟動參數。第二個線程的參數是“World”。當第一個線程開始執(zhí)行時,它使用參數“Hello”執(zhí)行函數print_message_function。它在標準輸出中打印“Hello”,然后結束對函數的調用。線程當離開它的初始化函數時就將終止,所以第一個線程在打印完“Hello”后終止。當第二個線程執(zhí)行時,它打印“World”然后終止。但這個程序有兩個主要的缺陷。<br>&nbsp;&nbsp;&nbsp; 首先也是最重要的是線程是同時執(zhí)行的。這樣就無法保證第一個線程先執(zhí)行打印語句。所以你很可能在屏幕上看到“World Hello”,而不是“Hello World”。請注意對exit的調用是父線程在主程序中使用的。這樣,如果父線程在兩個子線程調用打印語句之前調用exit,那么將不會有任何的打印輸出。這是因為exit函數將會退出進程,同時釋放任務,所以結束了所有的線程。任何線程(不論是父線程或者子線程)調用exit 都會終止所有其他線程。如果希望線程分別終止,可以使用pthread_exit函數。<br>我們可以使用一個辦法彌補此缺陷。我們可以在父線程中插入一個延遲程序,給子線程足夠的時間完成打印的調用。同樣,在調用第二個之前也插入一個延遲程序保證第一個線程在第二個線程執(zhí)行之前完成任務。<p>void print_message_function( void *ptr );<br>main ( )<br>{<br>pthread_t thread1, thread2;<br>char *message1 = &quot;Hello”;<br>char *message2 = &quot;Wo r l d &quot; ;<br>pthread_create( &amp;thread1, pthread_attr_default,<br>(void *) &amp;print_message_function, (void *) message1);<br>sleep (10) ;<br>pthread_create(&amp;thread2, pthread_attr_default,<br>(void *) &amp;print_message_function, (void *) message2);<br>sleep ( 10 ) ;<br>exit (0) ;<br>}<br>void print_message_function( void *ptr )<br>{<br>char *message;<br>message = (char *) ptr;<br>printf(&quot;%s&quot;, message);<br>pthread_exit(0) ;<br>}<p>&nbsp;&nbsp;&nbsp; 這樣是否達到了我們的要求了呢?不盡如此,因為依靠時間的延遲執(zhí)行同步是不可靠的。這里遇到的情形和一個分布程序和共享資源的情形一樣。共享的資源是標準的輸出設備,分布計算的程序是三個線程。<br>其實這里還有另外一個錯誤。函數sleep和函數e x i t一樣和進程有關。當線程調用sleep時,整個的進程都處于睡眠狀態(tài),也就是說,所有的三個線程都進入睡眠狀態(tài)。這樣我們實際上沒有解決任何的問題。希望使一個線程睡眠的函數是pthread_delay_np。例如讓一個線程睡眠2秒鐘,用如下程序:<p>struct timespec delay;<br>delay.tv_sec = 2;<br>delay.tv_nsec = 0;<br>pthread_delay_np( &amp;delay );<br>}<br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I261" ID="I261"></A><center><b><font size=+2>線程同步</font></b></center><br>POSIX提供兩種線程同步的方法,mutex和條件變量。mutex是一種簡單的加鎖的方法來控制對共享資源的存取。我們可以創(chuàng)建一個讀/寫程序,它們共用一個共享緩沖區(qū),使用mutex來控制對緩沖區(qū)的存取。<br>void reader_function(void);<br>void writer_function(void);<br>char buf f e r ;<br>int buffer_has_item = 0;<br>pthread_mutex_t mutex;<br>struct timespec delay;<br>main( )<br>{<br>pthread_t reader;<br>delay.tv_sec = 2;<br>delay.tv_nsec = 0;<br>pthread_mutex_init(&amp;mutex, pthread_mutexattr_default);<br>pthread_create( &amp;reader, pthread_attr_default, (void*)&amp;reader_function,<br>N U L L ) ;<br>writer_function( )<br>void writer_function(void)<br>{<br>while( 1 )<br>{<br>pthread_mutex_lock( &amp;mutex );<br>if ( buffer_has_item == 0 )<br>{<br>buffer = make_new_item();<br>buffer_has_item = 1;<br>}<br>pthread_mutex_unlock( &amp;mutex );<br>pthread_delay_np( &amp;delay );<br>}<br>}<br>void reader_function(void)<br>{<br>while( 1 )<br>{<br>pthread_mutex_lock( &amp;mutex );<br>if ( buffer_has_item == 1)<br>{<br>consume_item( buffer );<br>buffer_has_item = 0;<br>}<br>pthread_mutex_unlock( &amp;mutex );<br>pthread_delay_np( &amp;delay );<br>}<br>}<br>在上面的程序中,我們假定緩沖區(qū)只能保存一條信息,這樣緩沖區(qū)只有兩個狀態(tài),有一條信息或者沒有信息。使用延遲是為了避免一個線程永遠占有mutex。<br>但mutex的缺點在于它只有兩個狀態(tài),鎖定和非鎖定。POSIX的條件變量通過允許線程阻塞和等待另一個線程的信號方法,從而彌補了mutex的不足。當接受到一個信號時,阻塞線程將會被喚起,并試圖獲得相關的mutex的鎖。<p><p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I262" ID="I262"></A><center><b><font size=+2>使用信號量協(xié)調程序</font></b></center><br>我們可以使用信號量重新看一下上面的讀/寫程序。涉及信號量的操作是semaphore_up、semaphore_down、semaphore_init、semaphore_destroy和semaphore_decrement。所有這些操作都只有一個參數,一個指向信號量目標的指針。<br>void reader_function(void);<br>void writer_function(void);<br>char buffer ;<br>Semaphore writers_turn;<br>Semaphore readers_turn;<br>main( )<br>{<br>pthread_t reader;<br>semaphore_init( &amp;readers_turn );<br>semaphore_init( &amp;writers_turn );<br>/* writer must go first */<br>semaphore_down( &amp;readers_turn );<br>pthread_create( &amp;reader, pthread_attr_default,<br>(void *)&amp;reader_function, NULL);<br>w r i t e r _ f u n c t i o n ( ) ;<br>}<br>void writer_function(void)<br>{<br>w h i l e ( 1 )<br>{<br>semaphore_down( &amp;writers_turn );<br>b u ffer = make_new_item();<br>semaphore_up( &amp;readers_turn );<br>}<br>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美在线网站| 日韩欧美一区电影| 日韩高清电影一区| 久久久99久久精品欧美| 99久久99久久久精品齐齐| 亚洲电影视频在线| 久久久高清一区二区三区| 国产精品一区二区免费不卡| 亚洲激情图片qvod| 日韩欧美国产一区二区在线播放| 色综合天天综合网天天狠天天| 天堂成人国产精品一区| 亚洲欧美另类小说| 欧美成人一级视频| 91豆麻精品91久久久久久| 国内精品自线一区二区三区视频| 国产亚洲精品久| 欧美日本一道本| 成人高清视频在线观看| 日本不卡一区二区三区高清视频| 国产免费观看久久| 久久一夜天堂av一区二区三区| 欧美日韩国产高清一区二区三区 | 91成人免费网站| 免费一级欧美片在线观看| 精品久久久久久无| 国产寡妇亲子伦一区二区| 精品一区二区三区不卡| 日本韩国视频一区二区| 国产精品久久久久永久免费观看 | 在线不卡一区二区| 一级日本不卡的影视| 欧美在线观看视频一区二区| 伊人婷婷欧美激情| 91久久奴性调教| 美腿丝袜亚洲综合| 亚洲欧洲日本在线| 国产欧美日韩视频在线观看| 日韩视频在线你懂得| 欧美性色黄大片手机版| 欧美亚洲国产bt| 69久久夜色精品国产69蝌蚪网| 91视频免费播放| 成人动漫一区二区在线| 久久精品二区亚洲w码| 日韩综合在线视频| ...xxx性欧美| 成人免费在线观看入口| 国产精品美女久久久久av爽李琼 | 国产一区二区三区在线观看精品| 午夜精品久久久久久久99水蜜桃| 一区二区三区毛片| 国产拍欧美日韩视频二区| 久久久欧美精品sm网站| 日韩欧美中文一区| 欧美电视剧免费全集观看| 日韩三级视频在线看| 日韩精品专区在线| 欧美v日韩v国产v| 国产欧美一区二区精品忘忧草| 国产午夜亚洲精品羞羞网站| 国产午夜亚洲精品羞羞网站| 精品久久国产97色综合| 欧美精品一区二区三区视频| 欧美国产日本韩| 自拍av一区二区三区| 亚洲色图在线视频| 亚洲一区中文日韩| 国产精品久久福利| 亚洲午夜激情网页| 爽爽淫人综合网网站| 青青青爽久久午夜综合久久午夜| 麻豆国产欧美一区二区三区| 三级亚洲高清视频| 精品一区二区三区免费毛片爱| 精品一二三四区| 成人一区二区三区| 色综合网站在线| 欧美福利一区二区| 欧美高清一级片在线观看| 亚洲精品ww久久久久久p站| 午夜精品久久久久久久久| 捆绑变态av一区二区三区| 久久av中文字幕片| 欧洲精品一区二区| 欧美一级理论片| 国产午夜亚洲精品午夜鲁丝片 | 蜜臀av性久久久久蜜臀av麻豆| 国产精品看片你懂得| 日韩avvvv在线播放| 国产高清在线精品| 99在线热播精品免费| 欧美猛男超大videosgay| 9191久久久久久久久久久| 久久伊人蜜桃av一区二区| 夜夜亚洲天天久久| 国产剧情一区二区| av午夜一区麻豆| 一区二区中文字幕在线| 国产原创一区二区| jlzzjlzz欧美大全| 日韩精品一区二区三区四区| 综合久久综合久久| 国产传媒欧美日韩成人| 欧美裸体一区二区三区| 亚洲欧美日韩在线不卡| 国产精品18久久久久久久久 | 欧美日韩视频在线观看一区二区三区 | 国产精品美女www爽爽爽| 蜜桃视频一区二区| 在线亚洲免费视频| 国产精品麻豆99久久久久久| 精品一区二区三区在线视频| 欧美性xxxxx极品少妇| 中文字幕av一区二区三区免费看| 日本sm残虐另类| 欧美日韩精品欧美日韩精品| 一卡二卡三卡日韩欧美| 99亚偷拍自图区亚洲| 久久久99精品免费观看不卡| 麻豆国产精品一区二区三区| 欧美日韩中文精品| 一区二区三区**美女毛片| 粉嫩13p一区二区三区| 久久一夜天堂av一区二区三区| 日韩 欧美一区二区三区| 欧洲中文字幕精品| 亚洲人成小说网站色在线| 91片黄在线观看| 中文字幕欧美一| av电影天堂一区二区在线观看| 欧美mv日韩mv国产| 久久99最新地址| 精品国产三级a在线观看| 久久机这里只有精品| 精品美女在线观看| 国内精品伊人久久久久av影院| 欧美岛国在线观看| 激情图区综合网| 国产午夜精品久久| 另类调教123区| 亚洲成av人片在线观看| 一区二区成人在线视频| 国产欧美日韩综合| 在线欧美一区二区| 国产一区二区三区四区五区入口| 欧美精品一区二区三区四区 | 一区二区三区日韩欧美精品| 在线视频国内自拍亚洲视频| 91网上在线视频| 欧美精品一区二区高清在线观看| 亚洲欧洲国产日本综合| 91在线视频免费91| 亚洲一区二区三区四区的| 欧美精品在线观看一区二区| 日韩 欧美一区二区三区| 精品国产污污免费网站入口 | 亚洲蜜臀av乱码久久精品蜜桃| 91视频91自| 五月天欧美精品| 精品福利一二区| 不卡视频一二三| 亚洲一区二区三区视频在线| 日韩视频一区二区三区在线播放| 国产成人鲁色资源国产91色综 | 99热精品国产| 亚洲午夜精品网| 精品国产麻豆免费人成网站| 粉嫩欧美一区二区三区高清影视| 亚洲狠狠丁香婷婷综合久久久| 欧美日韩国产乱码电影| 国产精品一二三区在线| 亚洲人成电影网站色mp4| 欧美一级日韩免费不卡| 成人性视频网站| 亚洲第一成人在线| 久久久久一区二区三区四区| 色婷婷精品大视频在线蜜桃视频| 免费成人av在线| 国产精品护士白丝一区av| 欧美老年两性高潮| 大陆成人av片| 天天综合天天综合色| 国产精品私人影院| 欧美绝品在线观看成人午夜影视| 国产精品自拍网站| 亚洲视频一区在线观看| 日韩欧美资源站| 色噜噜狠狠色综合中国| 国产一区二区成人久久免费影院| 亚洲伊人伊色伊影伊综合网| 久久久久久久久久电影| 一本色道亚洲精品aⅴ| 韩日av一区二区| 五月天精品一区二区三区| 日韩美女啊v在线免费观看| 精品国产乱子伦一区| 91麻豆免费视频| 综合久久综合久久| 久久精品国产亚洲5555|