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

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

?? 管道及有名管道.txt

?? LINUX進程通信的學習資料
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
if((cmd<0)||(cmd>256))
//suppose child only support 256 commands
	{
	printf("child: invalid command \n");
	return -1;
	}
printf("child: the cmd from parent is %d\n", cmd);
return 0;
}
1.5管道的局限性
管道的主要局限性正體現在它的特點上:
* 只支持單向數據流; 
* 只能用于具有親緣關系的進程之間; 
* 沒有名字; 
* 管道的緩沖區是有限的(管道制存在于內存中,在管道創建時,為緩沖區分配一個頁面大小); 
* 管道所傳送的是無格式字節流,這就要求管道的讀出方和寫入方必須事先約定好數據的格式,比如多少字節算作一個消息(或命令、或記錄)等等; 
2、 有名管道概述及相關API應用
2.1 有名管道相關的關鍵概念
管道應用的一個重大限制是它沒有名字,因此,只能用于具有親緣關系的進程間通信,在有名管道(named pipe或FIFO)提出后,該限制得到了克服。FIFO不同于管道之處在于它提供一個路徑名與之關聯,以FIFO的文件形式存在于文件系統中。這樣,即使與FIFO的創建進程不存在親緣關系的進程,只要可以訪問該路徑,就能夠彼此通過FIFO相互通信(能夠訪問該路徑的進程以及FIFO的創建進程之間),因此,通過FIFO不相關的進程也能交換數據。值得注意的是,FIFO嚴格遵循先進先出(first in first out),對管道及FIFO的讀總是從開始處返回數據,對它們的寫則把數據添加到末尾。它們不支持諸如lseek()等文件定位操作。
2.2有名管道的創建

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char * pathname, mode_t mode)
該函數的第一個參數是一個普通的路徑名,也就是創建后FIFO的名字。第二個參數與打開普通文件的open()函數中的mode 參數相同。如果mkfifo的第一個參數是一個已經存在的路徑名時,會返回EEXIST錯誤,所以一般典型的調用代碼首先會檢查是否返回該錯誤,如果確實返回該錯誤,那么只要調用打開FIFO的函數就可以了。一般文件的I/O函數都可以用于FIFO,如close、read、write等等。
2.3有名管道的打開規則
有名管道比管道多了一個打開操作:open。
FIFO的打開規則:
如果當前打開操作是為讀而打開FIFO時,若已經有相應進程為寫而打開該FIFO,則當前打開操作將成功返回;否則,可能阻塞直到有相應進程為寫而打開該FIFO(當前打開操作設置了阻塞標志);或者,成功返回(當前打開操作沒有設置阻塞標志)。
如果當前打開操作是為寫而打開FIFO時,如果已經有相應進程為讀而打開該FIFO,則當前打開操作將成功返回;否則,可能阻塞直到有相應進程為讀而打開該FIFO(當前打開操作設置了阻塞標志);或者,返回ENXIO錯誤(當前打開操作沒有設置阻塞標志)。
對打開規則的驗證參見附2。
2.4有名管道的讀寫規則
從FIFO中讀取數據:
約定:如果一個進程為了從FIFO中讀取數據而阻塞打開FIFO,那么稱該進程內的讀操作為設置了阻塞標志的讀操作。
* 如果有進程寫打開FIFO,且當前FIFO內沒有數據,則對于設置了阻塞標志的讀操作來說,將一直阻塞。對于沒有設置阻塞標志讀操作來說則返回-1,當前errno值為EAGAIN,提醒以后再試。 
* 對于設置了阻塞標志的讀操作說,造成阻塞的原因有兩種:當前FIFO內有數據,但有其它進程在讀這些數據;另外就是FIFO內沒有數據。解阻塞的原因則是FIFO中有新的數據寫入,不論信寫入數據量的大小,也不論讀操作請求多少數據量。 
* 讀打開的阻塞標志只對本進程第一個讀操作施加作用,如果本進程內有多個讀操作序列,則在第一個讀操作被喚醒并完成讀操作后,其它將要執行的讀操作將不再阻塞,即使在執行讀操作時,FIFO中沒有數據也一樣(此時,讀操作返回0)。 
* 如果沒有進程寫打開FIFO,則設置了阻塞標志的讀操作會阻塞。 
注:如果FIFO中有數據,則設置了阻塞標志的讀操作不會因為FIFO中的字節數小于請求讀的字節數而阻塞,此時,讀操作會返回FIFO中現有的數據量。
向FIFO中寫入數據:
約定:如果一個進程為了向FIFO中寫入數據而阻塞打開FIFO,那么稱該進程內的寫操作為設置了阻塞標志的寫操作。
對于設置了阻塞標志的寫操作:
* 當要寫入的數據量不大于PIPE_BUF時,linux將保證寫入的原子性。如果此時管道空閑緩沖區不足以容納要寫入的字節數,則進入睡眠,直到當緩沖區中能夠容納要寫入的字節數時,才開始進行一次性寫操作。 
* 當要寫入的數據量大于PIPE_BUF時,linux將不再保證寫入的原子性。FIFO緩沖區一有空閑區域,寫進程就會試圖向管道寫入數據,寫操作在寫完所有請求寫的數據后返回。 
對于沒有設置阻塞標志的寫操作:
* 當要寫入的數據量大于PIPE_BUF時,linux將不再保證寫入的原子性。在寫滿所有FIFO空閑緩沖區后,寫操作返回。 
* 當要寫入的數據量不大于PIPE_BUF時,linux將保證寫入的原子性。如果當前FIFO空閑緩沖區能夠容納請求寫入的字節數,寫完后成功返回;如果當前FIFO空閑緩沖區不能夠容納請求寫入的字節數,則返回EAGAIN錯誤,提醒以后再寫; 
對FIFO讀寫規則的驗證:
下面提供了兩個對FIFO的讀寫程序,適當調節程序中的很少地方或者程序的命令行參數就可以對各種FIFO讀寫規則進行驗證。
程序1:寫FIFO的程序

#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#define FIFO_SERVER "/tmp/fifoserver"

main(int argc,char** argv)
//參數為即將寫入的字節數
{
	int fd;
	char w_buf[4096*2];
	int real_wnum;
	memset(w_buf,0,4096*2);
	if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
		printf("cannot create fifoserver\n");

	if(fd==-1)
		if(errno==ENXIO)
			printf("open error; no reading process\n");
		
     	fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);
	//設置非阻塞標志
	//fd=open(FIFO_SERVER,O_WRONLY,0);
	//設置阻塞標志
	real_wnum=write(fd,w_buf,2048);
	if(real_wnum==-1)
	{
		if(errno==EAGAIN)
			printf("write to fifo error; try later\n");
	}
	else 
		printf("real write num is %d\n",real_wnum);
	real_wnum=write(fd,w_buf,5000);
	//5000用于測試寫入字節大于4096時的非原子性
	//real_wnum=write(fd,w_buf,4096);
	//4096用于測試寫入字節不大于4096時的原子性
	
	if(real_wnum==-1)
		if(errno==EAGAIN)
			printf("try later\n");
}
程序2:與程序1一起測試寫FIFO的規則,第一個命令行參數是請求從FIFO讀出的字節數
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#define FIFO_SERVER "/tmp/fifoserver"

main(int argc,char** argv)
{
	char r_buf[4096*2];
	int  fd;
	int  r_size;
	int  ret_size;
	r_size=atoi(argv[1]);
	printf("requred real read bytes %d\n",r_size);
	memset(r_buf,0,sizeof(r_buf));
	fd=open(FIFO_SERVER,O_RDONLY|O_NONBLOCK,0);
	//fd=open(FIFO_SERVER,O_RDONLY,0);
	//在此處可以把讀程序編譯成兩個不同版本:阻塞版本及非阻塞版本
	if(fd==-1)
	{
		printf("open %s for read error\n");
		exit();	
	}
	while(1)
	{
		
		memset(r_buf,0,sizeof(r_buf));
		ret_size=read(fd,r_buf,r_size);
		if(ret_size==-1)
			if(errno==EAGAIN)
				printf("no data avlaible\n");
		printf("real read bytes %d\n",ret_size);
		sleep(1);
	}	
	pause();
	unlink(FIFO_SERVER);
}
程序應用說明:
把讀程序編譯成兩個不同版本:
* 阻塞讀版本:br 
* 以及非阻塞讀版本nbr 
把寫程序編譯成兩個四個版本:
* 非阻塞且請求寫的字節數大于PIPE_BUF版本:nbwg 
* 非阻塞且請求寫的字節數不大于PIPE_BUF版本:版本nbw 
* 阻塞且請求寫的字節數大于PIPE_BUF版本:bwg 
* 阻塞且請求寫的字節數不大于PIPE_BUF版本:版本bw 
下面將使用br、nbr、w代替相應程序中的阻塞讀、非阻塞讀
驗證阻塞寫操作:
1. 當請求寫入的數據量大于PIPE_BUF時的非原子性: 
o nbr 1000 
o bwg 
2. 當請求寫入的數據量不大于PIPE_BUF時的原子性: 
o nbr 1000 
o bw 
驗證非阻塞寫操作:
1. 當請求寫入的數據量大于PIPE_BUF時的非原子性: 
o nbr 1000 
o nbwg 
2. 請求寫入的數據量不大于PIPE_BUF時的原子性: 
o nbr 1000 
o nbw 
不管寫打開的阻塞標志是否設置,在請求寫入的字節數大于4096時,都不保證寫入的原子性。但二者有本質區別:
對于阻塞寫來說,寫操作在寫滿FIFO的空閑區域后,會一直等待,直到寫完所有數據為止,請求寫入的數據最終都會寫入FIFO;
而非阻塞寫則在寫滿FIFO的空閑區域后,就返回(實際寫入的字節數),所以有些數據最終不能夠寫入。
對于讀操作的驗證則比較簡單,不再討論。
2.5有名管道應用實例
在驗證了相應的讀寫規則后,應用實例似乎就沒有必要了。
小結:
管道常用于兩個方面:(1)在shell中時常會用到管道(作為輸入輸入的重定向),在這種應用方式下,管道的創建對于用戶來說是透明的;(2)用于具有親緣關系的進程間通信,用戶自己創建管道,并完成讀寫操作。
FIFO可以說是管道的推廣,克服了管道無名字的限制,使得無親緣關系的進程同樣可以采用先進先出的通信機制進行通信。
管道和FIFO的數據是字節流,應用程序之間必須事先確定特定的傳輸"協議",采用傳播具有特定意義的消息。
要靈活應用管道及FIFO,理解它們的讀寫規則是關鍵。
附1:kill -l 的運行結果,顯示了當前系統支持的所有信號:

1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL
5) SIGTRAP	 6) SIGABRT	 7) SIGBUS	 8) SIGFPE
9) SIGKILL	10) SIGUSR1	11) SIGSEGV	12) SIGUSR2
13) SIGPIPE	14) SIGALRM	15) SIGTERM	17) SIGCHLD
18) SIGCONT	19) SIGSTOP	20) SIGTSTP	21) SIGTTIN
22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO
30) SIGPWR	31) SIGSYS	32) SIGRTMIN	33) SIGRTMIN+1
34) SIGRTMIN+2	35) SIGRTMIN+3	36) SIGRTMIN+4	37) SIGRTMIN+5
38) SIGRTMIN+6	39) SIGRTMIN+7	40) SIGRTMIN+8	41) SIGRTMIN+9
42) SIGRTMIN+10	43) SIGRTMIN+11	44) SIGRTMIN+12	45) SIGRTMIN+13
46) SIGRTMIN+14	47) SIGRTMIN+15	48) SIGRTMAX-15	49) SIGRTMAX-14
50) SIGRTMAX-13	51) SIGRTMAX-12	52) SIGRTMAX-11	53) SIGRTMAX-10
54) SIGRTMAX-9	55) SIGRTMAX-8	56) SIGRTMAX-7	57) SIGRTMAX-6
58) SIGRTMAX-5	59) SIGRTMAX-4	60) SIGRTMAX-3	61) SIGRTMAX-2
62) SIGRTMAX-1	63) SIGRTMAX	
除了在此處用來說明管道應用外,接下來的專題還要對這些信號分類討論。
附2:對FIFO打開規則的驗證(主要驗證寫打開對讀打開的依賴性)

#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#define FIFO_SERVER "/tmp/fifoserver"

int handle_client(char*);
main(int argc,char** argv)
{
	int r_rd;
	int w_fd;
	pid_t pid;

	if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
		printf("cannot create fifoserver\n");
	handle_client(FIFO_SERVER);
	
}

int handle_client(char* arg)
{
int ret;
ret=w_open(arg);
switch(ret)
{
	case 0:
	{	
	printf("open %s error\n",arg);
	printf("no process has the fifo open for reading\n");
	return -1;
	}
	case -1:
	{
		printf("something wrong with open the fifo except for ENXIO");
		return -1;
	}
	case 1:
	{
		printf("open server ok\n");
		return 1;
	}
	default:
	{
		printf("w_no_r return ????\n");
		return 0;
	}
}		
unlink(FIFO_SERVER);
}

int w_open(char*arg)
//0  open error for no reading
//-1 open error for other reasons
//1  open ok
{
	if(open(arg,O_WRONLY|O_NONBLOCK,0)==-1)
	{	if(errno==ENXIO)
		{
			return 0;
		}
		else
		return -1;
	}
	return 1;
	
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久99精品一区二区三区三区| 五月天一区二区| 欧美sm美女调教| 欧美一区二区三区视频| 欧美特级限制片免费在线观看| 在线一区二区视频| 欧美综合久久久| 欧美一区二区三区影视| 日韩一区二区三区四区| 日韩一区二区三区视频在线| 在线电影国产精品| 日韩视频免费观看高清完整版在线观看| 欧美美女直播网站| 日韩一区二区三区三四区视频在线观看| 日韩一级二级三级| 国产午夜精品一区二区三区视频| 国产午夜精品一区二区三区视频| 国产精品嫩草影院av蜜臀| 最新中文字幕一区二区三区| 亚洲激情男女视频| 日本欧美在线观看| 国产麻豆欧美日韩一区| 97精品久久久午夜一区二区三区| 色综合久久综合中文综合网| 欧美精品tushy高清| 精品久久久久久久久久久院品网| 欧美激情中文字幕| 亚洲午夜久久久久久久久电影院| 天天av天天翘天天综合网| 蜜桃视频第一区免费观看| 国产麻豆精品一区二区| 色素色在线综合| 日韩美女视频一区二区在线观看| 国产精品免费人成网站| 日韩精品一级二级| 成人精品鲁一区一区二区| 欧美手机在线视频| 久久久久久97三级| 亚洲va在线va天堂| 国产成人自拍网| 欧美群妇大交群中文字幕| 国产欧美日韩亚州综合| 亚洲va欧美va人人爽午夜| 成人教育av在线| 日韩欧美国产1| 亚洲一区中文在线| 国产白丝精品91爽爽久久| 欧美日韩高清一区二区| 国产精品嫩草久久久久| 久久国产福利国产秒拍| 在线免费观看日本欧美| 国产日韩欧美综合在线| 日韩黄色片在线观看| 91免费在线视频观看| 欧美成人午夜电影| 日韩av一二三| 欧美亚洲高清一区| 亚洲人成小说网站色在线| 国产自产高清不卡| 欧美一区二区三区在线看| 亚洲成人精品在线观看| 91污片在线观看| 国产精品天天看| 国产精一品亚洲二区在线视频| 欧美日韩黄色一区二区| 一区二区三区日韩精品视频| 丰满亚洲少妇av| 欧美激情一区二区三区| 国产综合久久久久影院| 欧美va亚洲va| 蜜桃91丨九色丨蝌蚪91桃色| 91精品在线免费观看| 亚洲第一激情av| 欧美在线制服丝袜| 一二三四社区欧美黄| 色噜噜偷拍精品综合在线| 成人免费在线视频观看| 99精品国产一区二区三区不卡| 日本一区二区三区四区在线视频| 国产一区二三区| 久久女同互慰一区二区三区| 国产精品一区一区三区| 欧美激情一区二区三区不卡| 99在线精品视频| 亚洲欧美国产高清| 欧美性感一类影片在线播放| 亚洲成国产人片在线观看| 在线电影国产精品| 国产综合成人久久大片91| 国产日产欧美一区| 色婷婷激情一区二区三区| 午夜a成v人精品| 欧美一区欧美二区| 国产一区二区在线影院| 亚洲人成网站色在线观看| 欧美日韩在线不卡| 另类中文字幕网| 国产精品伦理一区二区| 欧美在线视频全部完| 裸体一区二区三区| 成人短视频下载 | gogogo免费视频观看亚洲一| 国内外成人在线| 欧美日韩视频在线第一区| 日韩欧美一区二区三区在线| 1024亚洲合集| 国产精品正在播放| 在线不卡中文字幕| 亚洲一区二区三区四区不卡| 日韩电影在线观看一区| 加勒比av一区二区| 在线看日本不卡| 久久免费视频色| 亚洲mv在线观看| 91色在线porny| 精品久久久久av影院| 亚洲一二三四在线观看| 国产精品综合二区| 精品久久一区二区| 舔着乳尖日韩一区| 欧洲一区二区三区在线| 亚洲人成网站精品片在线观看| 精品在线一区二区三区| 欧美高清dvd| 日韩不卡一二三区| 91精品国产91久久久久久一区二区| 亚洲男同性恋视频| 91蝌蚪国产九色| 亚洲精品久久久蜜桃| 91超碰这里只有精品国产| 欧美久久一二区| 欧美日韩一区二区欧美激情| 国产精品理伦片| 久久99热这里只有精品| 国产精品亚洲人在线观看| 欧美sm美女调教| 九一久久久久久| 中文字幕不卡在线观看| 成人h动漫精品| 一区二区三区在线视频观看58| 91黄视频在线| 精品亚洲欧美一区| 欧美一区二区三区男人的天堂| 丰满岳乱妇一区二区三区 | 日韩一区二区三区电影| 麻豆国产一区二区| 亚洲午夜在线观看视频在线| 日韩码欧中文字| 国产欧美日韩另类视频免费观看 | 亚洲一区二区三区美女| 亚洲视频狠狠干| 亚洲伦理在线免费看| 成人免费在线视频| 亚洲天天做日日做天天谢日日欢| 久久精品人人做人人爽97| 久久理论电影网| 中文字幕国产一区| 国产精品麻豆欧美日韩ww| 自拍偷拍国产亚洲| 亚洲欧美日韩小说| 亚洲激情六月丁香| 亚洲欧洲制服丝袜| 欧美亚一区二区| 欧美日本视频在线| 欧美色综合天天久久综合精品| 在线观看91视频| 欧美中文字幕一区| 欧美性猛片aaaaaaa做受| 欧美视频完全免费看| 在线视频你懂得一区二区三区| 91麻豆蜜桃一区二区三区| 一本到一区二区三区| 91在线精品一区二区| 91尤物视频在线观看| 国模套图日韩精品一区二区| 成人动漫一区二区在线| 国产成人日日夜夜| 国产精选一区二区三区| 国产在线精品视频| 91香蕉国产在线观看软件| 色系网站成人免费| 欧美视频日韩视频| 欧美一区午夜精品| 精品粉嫩超白一线天av| 久久综合九色综合欧美98| 亚洲三级电影网站| 亚洲午夜影视影院在线观看| 亚洲r级在线视频| 亚洲成av人影院在线观看网| 国产精品看片你懂得| 亚洲美女视频在线| 一区二区国产视频| 亚洲成人av资源| 成人一道本在线| 91福利视频网站| 555www色欧美视频| 亚洲免费视频中文字幕| 午夜日韩在线电影| 韩国毛片一区二区三区| 91成人在线精品|