嵌入式linux系統(tǒng)開發(fā)詳解第8進程_第1頁
嵌入式linux系統(tǒng)開發(fā)詳解第8進程_第2頁
嵌入式linux系統(tǒng)開發(fā)詳解第8進程_第3頁
嵌入式linux系統(tǒng)開發(fā)詳解第8進程_第4頁
嵌入式linux系統(tǒng)開發(fā)詳解第8進程_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第8章開發(fā)多進程/線程程序8.1

多進程開發(fā)8.2

多線程開發(fā)8.1

多進程開發(fā)8.1.1

什么是進程8.1.2

進程環(huán)境和屬性8.1.3

創(chuàng)建進程8.1.4

等待進程結(jié)束8.1.5

退出進程8.1.6

常用進程間通信的方法8.1.7

進程編程實例8.1.1

什么是進程進程就是一個正在運行的程序。當(dāng)運行可

執(zhí)行文件以后,操作系統(tǒng)會執(zhí)行文件中的

代碼,在CPU上運行的這組代碼被稱做進

程。一個進程不僅包含了正在運行的代碼,也包括了運行代碼所需要的資源(包括用

戶用到的資源和操作系統(tǒng)需要用的資源)。8.1.2

進程環(huán)境和屬性大多數(shù)UNIX系統(tǒng)的main()函數(shù)定義如下:int

main(int

argc,

char

*argv[],

char

*envp[]);POSIX標(biāo)準規(guī)定使用一個全局的環(huán)境變量

environ取代了參數(shù)envp,應(yīng)用程序可以通過getenv()和putenv()函數(shù)讀取或設(shè)定一個環(huán)境變量。

getenv()函數(shù)定義如下:#include<stdlib.h>char

*getenv(const

char

*name);8.1.3

創(chuàng)建進程Linux系統(tǒng)通過fork()系統(tǒng)調(diào)用創(chuàng)建一個進程,fork()函數(shù)定義如下:#include<sys/types.h>#include<unistd.h>pid_tfork(void);8.1.4

等待進程結(jié)束Linux系統(tǒng)提供給了一個waitpid()函數(shù),它的作用是等待另外一個進程結(jié)束,函數(shù)定義如下:#include<sys/types.h>#include<sys/wait.h>pid_t

waitpid(pid_t

pid,

int

*status,

intoptions);8.1.5

退出進程exit()函數(shù)的作用是退出當(dāng)前進程,并且盡可能釋放當(dāng)前進程占用的資源。_exit()函數(shù)作用也是退出當(dāng)前進程,但是并不試圖釋放進程占用的資源。atexit()函數(shù)和on_exit()函數(shù)的作用都是為程序退出時指定調(diào)用用戶的代碼#include

<stdlib.h>int

atexit(void

(*function)(void));int

on_exit(void

(*function)(int

,

void

*),

void

*arg);void

exit(int

status);#include

<unistd.h>void

_exit(int

status);8.1.6

常用進程間通信的方法Linux提供了多種進程間通信的方法,常見的包括管道、FIFO、消息隊列、信號量、共享內(nèi)存以及通過socket也可以實現(xiàn)不同進程間的通信。本節(jié)將簡述管道和共享內(nèi)存這兩種進程間的通信方法。1.管道2.共享內(nèi)存1.管道所有的UNIX系統(tǒng)都支持管道。管道就好像日常的水管一樣,在兩個進程之間,用來傳送數(shù)據(jù)。進程間的管道有兩個限制:一個是管道是半雙工的;另一個是管道只能在有共同父進程的進程間使用。2.共享內(nèi)存共享內(nèi)存是在內(nèi)存中開辟一段空間,供不同的進程訪問。與管道相比,共享內(nèi)存不僅能在多個不同進程(非父子進程)間共享數(shù)據(jù),而且可以比管道傳送更大量的數(shù)據(jù)。8.1.7

進程編程實例在本節(jié)的最后,給出一個多進程編程的綜合實例,程序會創(chuàng)建兩個進程,在父進程和子進程之間通過管道傳遞數(shù)據(jù),父進程向子進程發(fā)送字符串exit表示讓子進程退

出,并且等待子進程返回;子進程查詢管道,當(dāng)從管道讀出字符串exit的時候結(jié)束。8.2

多線程開發(fā)8.2.1

線程的概念8.2.2

進程和線程對比8.2.3

創(chuàng)建線程8.2.4

取消線程8.2.5

等待線程8.2.6

使用pthread庫線程操作實例8.2.1

線程的概念線程是一種輕量級的進程。線程沒有系統(tǒng)資源。線程是操作系統(tǒng)調(diào)度的最小單位。在操作系統(tǒng)內(nèi)核中,是按照線程作為調(diào)度單位來調(diào)度資源的。在一個進程內(nèi)部,多個線程之間的資源是共享的。8.2.2

進程和線程對比進程和線程有許多相似之處,但是也有許多不同:資源分配不同工作效率不同執(zhí)行方式不同8.2.3

創(chuàng)建線程Linux系統(tǒng)開發(fā)多線程程序大多使用pthread庫。pthread庫對線程操作的函數(shù)基本都以

pthread開頭,創(chuàng)建線程的函數(shù)定義如下:#include

<pthread.h>int

pthread_create(pthread_t

*restrict

thread,const

pthread_attr_t

*restrict

attr,void

*(*start_routine)(void*),

void

*restrictarg);8.2.4

取消線程線程的退出有幾種條件,當(dāng)線程本身的代碼運行結(jié)束后,會自動退出;或者線程代碼中調(diào)用return也會導(dǎo)致線程退出;還有一種情況是通過其他的線程把一個線程退出,pthread庫提供了pthread_cancel()函數(shù)用來取消一個線程的執(zhí)行。#include<pthread.h>int

pthread_cancel(pthread_t

thread);8.2.5

等待線程在線程操作實例中,主線程使用sleep()函數(shù)暫停自己的運行,等待新創(chuàng)建的線程結(jié)束。pthread庫提供了一種等待其他線程結(jié)束的方法,使用pthread_join()函數(shù)等待一個線程結(jié)束,函數(shù)定義如下:#include<pthread.h>int

pthread_join(pthread_t

thread,

void**value_ptr);8.2.6

使用pthread庫線程操作實例本節(jié)最后給出一個多線程操作實例,在主程序中創(chuàng)建兩個線程mid_t

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論