锘??xml version="1.0" encoding="utf-8" standalone="yes"?>老司机免费视频一区二区三区,韩国一区二区在线观看,欧美日韩高清在线一区http://m.shnenglu.com/jackdongy/category/20078.htmlHCP楂樻ц兘璁$畻鏋舵瀯錛屽疄鐜幫紝緙栬瘧鍣ㄦ寚浠や紭鍖栵紝綆楁硶浼樺寲錛? LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPIzh-cnThu, 10 Jan 2013 23:05:00 GMTThu, 10 Jan 2013 23:05:00 GMT60Linux榪涚▼闂撮氫俊錛氱閬撳強鏈夊悕綆¢亾 http://m.shnenglu.com/jackdongy/archive/2013/01/07/197062.htmljackdongjackdongMon, 07 Jan 2013 03:33:00 GMThttp://m.shnenglu.com/jackdongy/archive/2013/01/07/197062.htmlhttp://m.shnenglu.com/jackdongy/comments/197062.htmlhttp://m.shnenglu.com/jackdongy/archive/2013/01/07/197062.html#Feedback0http://m.shnenglu.com/jackdongy/comments/commentRss/197062.htmlhttp://m.shnenglu.com/jackdongy/services/trackbacks/197062.htmlhttp://linux.ccidnet.com/art/302/20061117/953467_1.html
綆¢亾鍙婃湁鍚嶇閬?

鍦ㄦ湰緋誨垪搴忎腑浣滆呮榪頒簡 linux 榪涚▼闂撮氫俊鐨勫嚑縐嶄富瑕佹墜孌點傚叾涓閬撳拰鏈夊悕綆¢亾鏄渶鏃╃殑榪涚▼闂撮氫俊鏈哄埗涔嬩竴錛岀閬撳彲鐢ㄤ簬鍏鋒湁浜茬紭鍏崇郴榪涚▼闂寸殑閫氫俊錛屾湁鍚嶇閬撳厠鏈嶄簡綆¢亾娌℃湁鍚嶅瓧鐨勯檺鍒訛紝鍥犳錛岄櫎鍏鋒湁綆¢亾鎵鍏鋒湁鐨勫姛鑳藉錛屽畠榪樺厑璁告棤浜茬紭鍏崇郴榪涚▼闂寸殑閫氫俊銆?璁ゆ竻綆¢亾鍜屾湁鍚嶇閬撶殑璇誨啓瑙勫垯鏄湪紼嬪簭涓簲鐢ㄥ畠浠殑鍏抽敭錛屾湰鏂囧湪璇︾粏璁ㄨ浜嗙閬撳拰鏈夊悕綆¢亾鐨勯氫俊鏈哄埗鐨勫熀紜涓婏紝鐢ㄥ疄渚嬪鍏惰鍐欒鍒欒繘琛屼簡紼嬪簭楠岃瘉錛岃繖鏍峰仛鏈夊埄浜庡寮鴻鑰呭璇誨啓瑙勫垯鐨勬劅鎬ц璇嗭紝鍚屾椂涔熸彁渚涗簡搴旂敤鑼冧緥銆?

1銆?綆¢亾姒傝堪鍙婄浉鍏矨PI搴旂敤

1.1 綆¢亾鐩稿叧鐨勫叧閿蹇?/strong>

綆¢亾鏄疞inux鏀寔鐨勬渶鍒漊nix IPC褰㈠紡涔嬩竴錛屽叿鏈変互涓嬬壒鐐癸細

綆¢亾鏄崐鍙屽伐鐨勶紝鏁版嵁鍙兘鍚戜竴涓柟鍚戞祦鍔紱闇瑕佸弻鏂歸氫俊鏃訛紝闇瑕佸緩绔嬭搗涓や釜綆¢亾錛?

鍙兘鐢ㄤ簬鐖跺瓙榪涚▼鎴栬呭厔寮熻繘紼嬩箣闂達紙鍏鋒湁浜茬紭鍏崇郴鐨勮繘紼嬶級錛?

鍗曠嫭鏋勬垚涓縐嶇嫭绔嬬殑鏂囦歡緋葷粺錛氱閬撳浜庣閬撲袱绔殑榪涚▼鑰岃█錛屽氨鏄竴涓枃浠訛紝浣嗗畠涓嶆槸鏅氱殑鏂囦歡錛屽畠涓嶅睘浜庢煇縐嶆枃浠剁郴緇燂紝鑰屾槸鑷珛闂ㄦ埛錛屽崟鐙瀯鎴愪竴縐嶆枃浠剁郴緇燂紝騫朵笖鍙瓨鍦ㄤ笌鍐呭瓨涓?

鏁版嵁鐨勮鍑哄拰鍐欏叆錛氫竴涓繘紼嬪悜綆¢亾涓啓鐨勫唴瀹硅綆¢亾鍙︿竴绔殑榪涚▼璇誨嚭銆傚啓鍏ョ殑鍐呭姣忔閮芥坊鍔犲湪綆¢亾緙撳啿鍖虹殑鏈熬錛屽茍涓旀瘡嬈¢兘鏄粠緙撳啿鍖虹殑澶撮儴璇誨嚭鏁版嵁銆?

1.2綆¢亾鐨勫垱寤猴細

#include 
int pipe(int fd[2])

璇ュ嚱鏁板垱寤虹殑綆¢亾鐨勪袱绔浜庝竴涓繘紼嬩腑闂達紝鍦ㄥ疄闄呭簲鐢ㄤ腑娌℃湁澶ぇ鎰忎箟錛屽洜姝わ紝涓涓繘紼嬪湪鐢眕ipe()鍒涘緩綆¢亾鍚庯紝涓鑸啀fork涓涓瓙榪涚▼錛岀劧鍚庨氳繃綆¢亾瀹炵幇鐖跺瓙榪涚▼闂寸殑閫氫俊錛堝洜姝や篃涓嶉毦鎺ㄥ嚭錛屽彧瑕佷袱涓繘紼嬩腑瀛樺湪浜茬紭鍏崇郴錛岃繖閲岀殑浜茬紭鍏崇郴鎸囩殑鏄叿鏈夊叡鍚岀殑紲栧厛錛岄兘鍙互閲囩敤綆¢亾鏂瑰紡鏉ヨ繘琛岄氫俊錛夈?

1.3綆¢亾鐨勮鍐欒鍒欙細

綆¢亾涓ょ鍙垎鍒敤鎻忚堪瀛梖d[0]浠ュ強fd[1]鏉ユ弿榪幫紝闇瑕佹敞鎰忕殑鏄紝綆¢亾鐨勪袱绔槸鍥哄畾浜嗕換鍔$殑銆傚嵆涓绔彧鑳界敤浜庤錛岀敱鎻忚堪瀛梖d[0]琛ㄧず錛岀О鍏朵負綆¢亾璇葷錛涘彟涓绔垯鍙兘鐢ㄤ簬鍐欙紝鐢辨弿榪板瓧fd[1]鏉ヨ〃紺猴紝縐板叾涓虹閬撳啓绔傚鏋滆瘯鍥句粠綆¢亾鍐欑璇誨彇鏁版嵁錛屾垨鑰呭悜綆¢亾璇葷鍐欏叆鏁版嵁閮藉皢瀵艱嚧閿欒鍙戠敓銆備竴鑸枃浠剁殑I/O鍑芥暟閮藉彲浠ョ敤浜庣閬擄紝濡俢lose銆乺ead銆亀rite絳夌瓑銆?

浠庣閬撲腑璇誨彇鏁版嵁錛?

濡傛灉綆¢亾鐨勫啓绔笉瀛樺湪錛屽垯璁や負宸茬粡璇誨埌浜嗘暟鎹殑鏈熬錛岃鍑芥暟榪斿洖鐨勮鍑哄瓧鑺傛暟涓?錛涘綋綆¢亾鐨勫啓绔瓨鍦ㄦ椂錛屽鏋滆姹傜殑瀛楄妭鏁扮洰澶т簬PIPE_BUF錛屽垯榪斿洖綆¢亾涓幇鏈夌殑鏁版嵁瀛楄妭鏁幫紝濡傛灉璇鋒眰鐨勫瓧鑺傛暟鐩笉澶т簬PIPE_BUF錛屽垯榪斿洖綆¢亾涓幇鏈夋暟鎹瓧鑺傛暟錛堟鏃訛紝綆¢亾涓暟鎹噺灝忎簬璇鋒眰鐨勬暟鎹噺錛夛紱鎴栬呰繑鍥炶姹傜殑瀛楄妭鏁幫紙姝ゆ椂錛岀閬撲腑鏁版嵁閲忎笉灝忎簬璇鋒眰鐨勬暟鎹噺錛夈傛敞錛氾紙PIPE_BUF鍦╥nclude/linux/limits.h涓畾涔夛紝涓嶅悓鐨勫唴鏍哥増鏈彲鑳戒細鏈夋墍涓嶅悓銆侾osix.1瑕佹眰PIPE_BUF鑷沖皯涓?12瀛楄妭錛宺ed hat 7.2涓負4096錛夈?

鍏充簬綆¢亾鐨勮瑙勫垯楠岃瘉錛?

* readtest.c *
#include 
#include 
#include 
main()
{
int pipe_fd[2];
pid_t pid;
char r_buf[100];
char w_buf[4];
char* p_wbuf;
int r_num;
int cmd;

memset(r_buf,0,sizeof(r_buf));
memset(w_buf,0,sizeof(r_buf));
p_wbuf=w_buf;
if(pipe(pipe_fd)<0)
{
printf("pipe create error\n");
return -1;
}

if((pid=fork())==0)
{
printf("\n");
close(pipe_fd[1]);
sleep(3);//紜繚鐖惰繘紼嬪叧闂啓绔?
r_num=read(pipe_fd[0],r_buf,100);
printf( "read num is %d the data read from the pipe is %d\n",r_num,atoi(r_buf));

close(pipe_fd[0]);
exit();
}
else if(pid>0)
{
close(pipe_fd[0]);//read
strcpy(w_buf,"111");
if(write(pipe_fd[1],w_buf,4)!=-1)
printf("parent write over\n");
close(pipe_fd[1]);//write
printf("parent close fd[1] over\n");
sleep(10);
} 
}

紼嬪簭杈撳嚭緇撴灉錛?

* parent write over
* parent close fd[1] over
* read num is 4 the data read from the pipe is 111

闄勫姞緇撹錛氱閬撳啓绔叧闂悗錛屽啓鍏ョ殑鏁版嵁灝嗕竴鐩村瓨鍦紝鐩村埌璇誨嚭涓烘銆?

鍚戠閬撲腑鍐欏叆鏁版嵁錛?

鍚戠閬撲腑鍐欏叆鏁版嵁鏃訛紝linux灝嗕笉淇濊瘉鍐欏叆鐨勫師瀛愭э紝綆¢亾緙撳啿鍖轟竴鏈夌┖闂插尯鍩燂紝鍐欒繘紼嬪氨浼氳瘯鍥懼悜綆¢亾鍐欏叆鏁版嵁銆傚鏋滆榪涚▼涓嶈璧扮閬撶紦鍐插尯涓殑鏁版嵁錛岄偅涔堝啓鎿嶄綔灝嗕竴鐩撮樆濉炪?

娉細鍙湁鍦ㄧ閬撶殑璇葷瀛樺湪鏃訛紝鍚戠閬撲腑鍐欏叆鏁版嵁鎵嶆湁鎰忎箟銆傚惁鍒欙紝鍚戠閬撲腑鍐欏叆鏁版嵁鐨勮繘紼嬪皢鏀跺埌鍐呮牳浼犳潵鐨凷IFPIPE淇″彿錛屽簲鐢ㄧ▼搴忓彲浠ュ鐞嗚淇″彿錛屼篃鍙互蹇界暐錛堥粯璁ゅ姩浣滃垯鏄簲鐢ㄧ▼搴忕粓姝級銆傚綆¢亾鐨勫啓瑙勫垯鐨勯獙璇?錛氬啓绔璇葷瀛樺湪鐨勪緷璧栨?

#include 
#include 
main()
{
int pipe_fd[2];
pid_t pid;
char r_buf[4];
char* w_buf;
int writenum;
int cmd;

memset(r_buf,0,sizeof(r_buf));
if(pipe(pipe_fd)<0)
{
printf("pipe create error\n");
return -1;
}

if((pid=fork())==0)
{
close(pipe_fd[0]);
close(pipe_fd[1]);
sleep(10); 
exit();
}
else if(pid>0)
{
sleep(1); //絳夊緟瀛愯繘紼嬪畬鎴愬叧闂绔殑鎿嶄綔
close(pipe_fd[0]);//write
w_buf="111";
if((writenum=write(pipe_fd[1],w_buf,4))==-1)
printf("write to pipe error\n");
else 
printf("the bytes write to pipe is %d \n", writenum);

close(pipe_fd[1]);
} 
}

鍒欒緭鍑虹粨鏋滀負錛?Broken pipe,鍘熷洜灝辨槸璇ョ閬撲互鍙婂畠鐨勬墍鏈塮ork()浜х墿鐨勮绔兘宸茬粡琚叧闂傚鏋滃湪鐖惰繘紼嬩腑淇濈暀璇葷錛屽嵆鍦ㄥ啓瀹宲ipe鍚庯紝鍐嶅叧闂埗榪涚▼鐨勮绔紝涔熶細姝e父鍐欏叆pipe錛岃鑰呭彲鑷繁楠岃瘉涓涓嬭緇撹銆傚洜姝わ紝鍦ㄥ悜綆¢亾鍐欏叆鏁版嵁鏃訛紝鑷沖皯搴旇瀛樺湪鏌愪竴涓繘紼嬶紝鍏朵腑綆¢亾璇葷娌℃湁琚叧闂紝鍚﹀垯灝變細鍑虹幇涓婅堪閿欒錛堢閬撴柇瑁?榪涚▼鏀跺埌浜哠IGPIPE淇″彿錛岄粯璁ゅ姩浣滄槸榪涚▼緇堟錛夊綆¢亾鐨勫啓瑙勫垯鐨勯獙璇?錛歭inux涓嶄繚璇佸啓綆¢亾鐨勫師瀛愭ч獙璇?

#include 
#include 
#include 
main(int argc,char**argv)
{
int pipe_fd[2];
pid_t pid;
char r_buf[4096];
char w_buf[4096*2];
int writenum;
int rnum;
memset(r_buf,0,sizeof(r_buf)); 
if(pipe(pipe_fd)<0)
{
printf("pipe create error\n");
return -1;
}

if((pid=fork())==0)
{
close(pipe_fd[1]);
while(1)
{
sleep(1); 
rnum=read(pipe_fd[0],r_buf,1000);
printf("child: readnum is %d\n",rnum);
}
close(pipe_fd[0]);

exit();
}
else if(pid>0)
{
close(pipe_fd[0]);//write
memset(r_buf,0,sizeof(r_buf)); 
if((writenum=write(pipe_fd[1],w_buf,1024))==-1)
printf("write to pipe error\n");
else 
printf("the bytes write to pipe is %d \n", writenum);
writenum=write(pipe_fd[1],w_buf,4096);
close(pipe_fd[1]);
} 
}

杈撳嚭緇撴灉錛?

the bytes write to pipe 1000
the bytes write to pipe 1000 //娉ㄦ剰錛屾琛岃緭鍑鴻鏄庝簡鍐欏叆鐨勯潪鍘熷瓙鎬?
the bytes write to pipe 1000
the bytes write to pipe 1000
the bytes write to pipe 1000
the bytes write to pipe 120 //娉ㄦ剰錛屾琛岃緭鍑鴻鏄庝簡鍐欏叆鐨勯潪鍘熷瓙鎬?
the bytes write to pipe 0
the bytes write to pipe 0
......

緇撹錛?

鍐欏叆鏁扮洰灝忎簬4096鏃跺啓鍏ユ槸闈炲師瀛愮殑錛?

濡傛灉鎶婄埗榪涚▼涓殑涓ゆ鍐欏叆瀛楄妭鏁伴兘鏀逛負5000錛屽垯寰堝鏄撳緱鍑轟笅闈㈢粨璁猴細

鍐欏叆綆¢亾鐨勬暟鎹噺澶т簬4096瀛楄妭鏃訛紝緙撳啿鍖虹殑絀洪棽絀洪棿灝嗚鍐欏叆鏁版嵁錛堣ˉ榻愶級錛岀洿鍒板啓瀹屾墍鏈夋暟鎹負姝紝濡傛灉娌℃湁榪涚▼璇繪暟鎹紝鍒欎竴鐩撮樆濉炪?


1.4綆¢亾搴旂敤瀹炰緥錛?/strong>

瀹炰緥涓錛氱敤浜巗hell

綆¢亾鍙敤浜庤緭鍏ヨ緭鍑洪噸瀹氬悜錛屽畠灝嗕竴涓懡浠ょ殑杈撳嚭鐩存帴瀹氬悜鍒板彟涓涓懡浠ょ殑杈撳叆銆傛瘮濡傦紝褰撳湪鏌愪釜shell紼嬪簭錛圔ourne shell鎴朇 shell絳夛級閿叆who│wc -l鍚庯紝鐩稿簲shell紼嬪簭灝嗗垱寤簑ho浠ュ強wc涓や釜榪涚▼鍜岃繖涓や釜榪涚▼闂寸殑綆¢亾銆傝冭檻涓嬮潰鐨勫懡浠よ錛?

$kill -l 榪愯緇撴灉瑙侀檮涓銆?

$kill -l | grep SIGRTMIN 榪愯緇撴灉濡備笅錛?

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

瀹炰緥浜岋細鐢ㄤ簬鍏鋒湁浜茬紭鍏崇郴鐨勮繘紼嬮棿閫氫俊

涓嬮潰渚嬪瓙緇欏嚭浜嗙閬撶殑鍏蜂綋搴旂敤錛岀埗榪涚▼閫氳繃綆¢亾鍙戦佷竴浜涘懡浠ょ粰瀛愯繘紼嬶紝瀛愯繘紼嬭В鏋愬懡浠わ紝騫舵牴鎹懡浠や綔鐩稿簲澶勭悊銆?

#include 
#include 
main()
{
int pipe_fd[2];
pid_t pid;
char r_buf[4];
char** w_buf[256];
int childexit=0;
int i;
int cmd;

memset(r_buf,0,sizeof(r_buf));

if(pipe(pipe_fd)<0)
{
printf("pipe create error\n");
return -1;
}
if((pid=fork())==0)
//瀛愯繘紼嬶細瑙f瀽浠庣閬撲腑鑾峰彇鐨勫懡浠わ紝騫朵綔鐩稿簲鐨勫鐞?
{
printf("\n");
close(pipe_fd[1]);
sleep(2);

while(!childexit)
{ 
read(pipe_fd[0],r_buf,4);
cmd=atoi(r_buf);
if(cmd==0)
{
printf("child: receive command from parent over\n now child process exit\n");
childexit=1;
}

else if(handle_cmd(cmd)!=0)
return;
sleep(1);
}
close(pipe_fd[0]);
exit();
}
else if(pid>0)
//parent: send commands to child
{
close(pipe_fd[0]);

w_buf[0]="003";
w_buf[1]="005";
w_buf[2]="777";
w_buf[3]="000";
for(i=0;i<4;i++)
write(pipe_fd[1],w_buf,4);
close(pipe_fd[1]);
} 
}
//涓嬮潰鏄瓙榪涚▼鐨勫懡浠ゅ鐞嗗嚱鏁幫紙鐗瑰畾浜庡簲鐢級錛?
int handle_cmd(int cmd)
{
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綆¢亾鐨勫眬闄愭?/strong>

綆¢亾鐨勪富瑕佸眬闄愭ф浣撶幇鍦ㄥ畠鐨勭壒鐐逛笂錛?

鍙敮鎸佸崟鍚戞暟鎹祦錛?

鍙兘鐢ㄤ簬鍏鋒湁浜茬紭鍏崇郴鐨勮繘紼嬩箣闂達紱

娌℃湁鍚嶅瓧錛?

綆¢亾鐨勭紦鍐插尯鏄湁闄愮殑錛堢閬撳埗瀛樺湪浜庡唴瀛樹腑錛屽湪綆¢亾鍒涘緩鏃訛紝涓虹紦鍐插尯鍒嗛厤涓涓〉闈㈠ぇ灝忥級錛?

綆¢亾鎵浼犻佺殑鏄棤鏍煎紡瀛楄妭嫻侊紝榪欏氨瑕佹眰綆¢亾鐨勮鍑烘柟鍜屽啓鍏ユ柟蹇呴』浜嬪厛綰﹀畾濂芥暟鎹殑鏍煎紡錛屾瘮濡傚灝戝瓧鑺傜畻浣滀竴涓秷鎭紙鎴栧懡浠ゃ佹垨璁板綍錛夌瓑絳夈?

2銆?鏈夊悕綆¢亾姒傝堪鍙婄浉鍏矨PI搴旂敤

2.1 鏈夊悕綆¢亾鐩稿叧鐨勫叧閿蹇?/strong>

綆¢亾搴旂敤鐨勪竴涓噸澶ч檺鍒舵槸瀹冩病鏈夊悕瀛楋紝鍥犳錛屽彧鑳界敤浜庡叿鏈変翰緙樺叧緋葷殑榪涚▼闂撮氫俊錛屽湪鏈夊悕綆¢亾錛坣amed pipe鎴朏IFO錛夋彁鍑哄悗錛岃闄愬埗寰楀埌浜嗗厠鏈嶃侳IFO涓嶅悓浜庣閬撲箣澶勫湪浜庡畠鎻愪緵涓涓礬寰勫悕涓庝箣鍏寵仈錛屼互FIFO鐨勬枃浠跺艦寮忓瓨鍦ㄤ簬鏂囦歡緋葷粺涓傝繖鏍鳳紝鍗充嬌涓嶧IFO鐨勫垱寤鴻繘紼嬩笉瀛樺湪浜茬紭鍏崇郴鐨勮繘紼嬶紝鍙鍙互璁塊棶璇ヨ礬寰勶紝灝辮兘澶熷郊姝ら氳繃FIFO鐩鎬簰閫氫俊錛堣兘澶熻闂璺緞鐨勮繘紼嬩互鍙奆IFO鐨勫垱寤鴻繘紼嬩箣闂達級錛屽洜姝わ紝閫氳繃FIFO涓嶇浉鍏崇殑榪涚▼涔熻兘浜ゆ崲鏁版嵁銆傚煎緱娉ㄦ剰鐨勬槸錛孎IFO涓ユ牸閬靛驚鍏堣繘鍏堝嚭錛坒irst in first out錛夛紝瀵圭閬撳強FIFO鐨勮鎬繪槸浠庡紑濮嬪榪斿洖鏁版嵁錛屽瀹冧滑鐨勫啓鍒欐妸鏁版嵁娣誨姞鍒版湯灝俱傚畠浠笉鏀寔璇稿lseek()絳夋枃浠跺畾浣嶆搷浣溿?

2.2鏈夊悕綆¢亾鐨勫垱寤?/strong>

#include 
#include 
int mkfifo(const char * pathname, mode_t mode)

璇ュ嚱鏁扮殑絎竴涓弬鏁版槸涓涓櫘閫氱殑璺緞鍚嶏紝涔熷氨鏄垱寤哄悗FIFO鐨勫悕瀛椼傜浜屼釜鍙傛暟涓庢墦寮鏅氭枃浠剁殑open()鍑芥暟涓殑mode 鍙傛暟鐩稿悓銆傚鏋渕kfifo鐨勭涓涓弬鏁版槸涓涓凡緇忓瓨鍦ㄧ殑璺緞鍚嶆椂錛屼細榪斿洖EEXIST閿欒錛屾墍浠ヤ竴鑸吀鍨嬬殑璋冪敤浠g爜棣栧厛浼氭鏌ユ槸鍚﹁繑鍥炶閿欒錛屽鏋滅‘瀹炶繑鍥炶閿欒錛岄偅涔堝彧瑕佽皟鐢ㄦ墦寮FIFO鐨勫嚱鏁板氨鍙互浜嗐備竴鑸枃浠剁殑I/O鍑芥暟閮藉彲浠ョ敤浜嶧IFO錛屽close銆乺ead銆亀rite絳夌瓑銆?

2.3鏈夊悕綆¢亾鐨勬墦寮瑙勫垯

鏈夊悕綆¢亾姣旂閬撳浜嗕竴涓墦寮鎿嶄綔錛歰pen銆?

FIFO鐨勬墦寮瑙勫垯錛?

濡傛灉褰撳墠鎵撳紑鎿嶄綔鏄負璇昏屾墦寮FIFO鏃訛紝鑻ュ凡緇忔湁鐩稿簲榪涚▼涓哄啓鑰屾墦寮璇IFO錛屽垯褰撳墠鎵撳紑鎿嶄綔灝嗘垚鍔熻繑鍥烇紱鍚﹀垯錛屽彲鑳介樆濉炵洿鍒版湁鐩稿簲榪涚▼涓哄啓鑰屾墦寮璇IFO錛堝綋鍓嶆墦寮鎿嶄綔璁劇疆浜嗛樆濉炴爣蹇楋級錛涙垨鑰咃紝鎴愬姛榪斿洖錛堝綋鍓嶆墦寮鎿嶄綔娌℃湁璁劇疆闃誨鏍囧織錛夈?

濡傛灉褰撳墠鎵撳紑鎿嶄綔鏄負鍐欒屾墦寮FIFO鏃訛紝濡傛灉宸茬粡鏈夌浉搴旇繘紼嬩負璇昏屾墦寮璇IFO錛屽垯褰撳墠鎵撳紑鎿嶄綔灝嗘垚鍔熻繑鍥烇紱鍚﹀垯錛屽彲鑳介樆濉炵洿鍒版湁鐩稿簲榪涚▼涓鴻鑰屾墦寮璇IFO錛堝綋鍓嶆墦寮鎿嶄綔璁劇疆浜嗛樆濉炴爣蹇楋級錛涙垨鑰咃紝榪斿洖ENXIO閿欒錛堝綋鍓嶆墦寮鎿嶄綔娌℃湁璁劇疆闃誨鏍囧織錛夈傚鎵撳紑瑙勫垯鐨勯獙璇佸弬瑙侀檮2銆?


2.4鏈夊悕綆¢亾鐨勮鍐欒鍒?/strong>

浠嶧IFO涓鍙栨暟鎹細

綰﹀畾錛氬鏋滀竴涓繘紼嬩負浜嗕粠FIFO涓鍙栨暟鎹岄樆濉炴墦寮FIFO錛岄偅涔堢О璇ヨ繘紼嬪唴鐨勮鎿嶄綔涓鴻緗簡闃誨鏍囧織鐨勮鎿嶄綔銆?

濡傛灉鏈夎繘紼嬪啓鎵撳紑FIFO錛屼笖褰撳墠FIFO鍐呮病鏈夋暟鎹紝鍒欏浜庤緗簡闃誨鏍囧織鐨勮鎿嶄綔鏉ヨ錛屽皢涓鐩撮樆濉炪傚浜庢病鏈夎緗樆濉炴爣蹇楄鎿嶄綔鏉ヨ鍒欒繑鍥?1錛屽綋鍓峞rrno鍊間負EAGAIN錛屾彁閱掍互鍚庡啀璇曘?

瀵逛簬璁劇疆浜嗛樆濉炴爣蹇楃殑璇繪搷浣滆錛岄犳垚闃誨鐨勫師鍥犳湁涓ょ錛氬綋鍓岶IFO鍐呮湁鏁版嵁錛屼絾鏈夊叾瀹冭繘紼嬪湪璇昏繖浜涙暟鎹紱鍙﹀灝辨槸FIFO鍐呮病鏈夋暟鎹傝В闃誨鐨勫師鍥犲垯鏄疐IFO涓湁鏂扮殑鏁版嵁鍐欏叆錛屼笉璁轟俊鍐欏叆鏁版嵁閲忕殑澶у皬錛屼篃涓嶈璇繪搷浣滆姹傚灝戞暟鎹噺銆?

璇繪墦寮鐨勯樆濉炴爣蹇楀彧瀵規湰榪涚▼絎竴涓鎿嶄綔鏂藉姞浣滅敤錛屽鏋滄湰榪涚▼鍐呮湁澶氫釜璇繪搷浣滃簭鍒楋紝鍒欏湪絎竴涓鎿嶄綔琚敜閱掑茍瀹屾垚璇繪搷浣滃悗錛屽叾瀹冨皢瑕佹墽琛岀殑璇繪搷浣滃皢涓嶅啀闃誨錛屽嵆浣垮湪鎵ц璇繪搷浣滄椂錛孎IFO涓病鏈夋暟鎹篃涓鏍鳳紙姝ゆ椂錛岃鎿嶄綔榪斿洖0錛夈?

濡傛灉娌℃湁榪涚▼鍐欐墦寮FIFO錛屽垯璁劇疆浜嗛樆濉炴爣蹇楃殑璇繪搷浣滀細闃誨銆?

娉細濡傛灉FIFO涓湁鏁版嵁錛屽垯璁劇疆浜嗛樆濉炴爣蹇楃殑璇繪搷浣滀笉浼氬洜涓篎IFO涓殑瀛楄妭鏁板皬浜庤姹傝鐨勫瓧鑺傛暟鑰岄樆濉烇紝姝ゆ椂錛岃鎿嶄綔浼氳繑鍥濬IFO涓幇鏈夌殑鏁版嵁閲忋?

鍚慒IFO涓啓鍏ユ暟鎹細

綰﹀畾錛氬鏋滀竴涓繘紼嬩負浜嗗悜FIFO涓啓鍏ユ暟鎹岄樆濉炴墦寮FIFO錛岄偅涔堢О璇ヨ繘紼嬪唴鐨勫啓鎿嶄綔涓鴻緗簡闃誨鏍囧織鐨勫啓鎿嶄綔銆?

瀵逛簬璁劇疆浜嗛樆濉炴爣蹇楃殑鍐欐搷浣滐細

褰撹鍐欏叆鐨勬暟鎹噺涓嶅ぇ浜嶱IPE_BUF鏃訛紝linux灝嗕繚璇佸啓鍏ョ殑鍘熷瓙鎬с傚鏋滄鏃剁閬撶┖闂茬紦鍐插尯涓嶈凍浠ュ綰寵鍐欏叆鐨勫瓧鑺傛暟錛屽垯榪涘叆鐫$湢錛岀洿鍒板綋緙撳啿鍖轟腑鑳藉瀹圭撼瑕佸啓鍏ョ殑瀛楄妭鏁版椂錛屾墠寮濮嬭繘琛屼竴嬈℃у啓鎿嶄綔銆?

褰撹鍐欏叆鐨勬暟鎹噺澶т簬PIPE_BUF鏃訛紝linux灝嗕笉鍐嶄繚璇佸啓鍏ョ殑鍘熷瓙鎬с侳IFO緙撳啿鍖轟竴鏈夌┖闂插尯鍩燂紝鍐欒繘紼嬪氨浼氳瘯鍥懼悜綆¢亾鍐欏叆鏁版嵁錛屽啓鎿嶄綔鍦ㄥ啓瀹屾墍鏈夎姹傚啓鐨勬暟鎹悗榪斿洖銆?

瀵逛簬娌℃湁璁劇疆闃誨鏍囧織鐨勫啓鎿嶄綔錛?

褰撹鍐欏叆鐨勬暟鎹噺澶т簬PIPE_BUF鏃訛紝linux灝嗕笉鍐嶄繚璇佸啓鍏ョ殑鍘熷瓙鎬с傚湪鍐欐弧鎵鏈塅IFO絀洪棽緙撳啿鍖哄悗錛屽啓鎿嶄綔榪斿洖銆?

褰撹鍐欏叆鐨勬暟鎹噺涓嶅ぇ浜嶱IPE_BUF鏃訛紝linux灝嗕繚璇佸啓鍏ョ殑鍘熷瓙鎬с傚鏋滃綋鍓岶IFO絀洪棽緙撳啿鍖鴻兘澶熷綰寵姹傚啓鍏ョ殑瀛楄妭鏁幫紝鍐欏畬鍚庢垚鍔熻繑鍥烇紱濡傛灉褰撳墠FIFO絀洪棽緙撳啿鍖轟笉鑳藉瀹圭撼璇鋒眰鍐欏叆鐨勫瓧鑺傛暟錛屽垯榪斿洖EAGAIN閿欒錛屾彁閱掍互鍚庡啀鍐欙紱

瀵笷IFO璇誨啓瑙勫垯鐨勯獙璇侊細

涓嬮潰鎻愪緵浜嗕袱涓FIFO鐨勮鍐欑▼搴忥紝閫傚綋璋冭妭紼嬪簭涓殑寰堝皯鍦版柟鎴栬呯▼搴忕殑鍛戒護琛屽弬鏁板氨鍙互瀵瑰悇縐岶IFO璇誨啓瑙勫垯榪涜楠岃瘉銆?

紼嬪簭1錛氬啓FIFO鐨勭▼搴?

#include 
#include 
#include 
#include 
#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鐢ㄤ簬嫻嬭瘯鍐欏叆瀛楄妭涓嶅ぇ浜?096鏃剁殑鍘熷瓙鎬?

if(real_wnum==-1)
if(errno==EAGAIN)
printf("try later\n");
}

紼嬪簭2錛氫笌紼嬪簭1涓璧鋒祴璇曞啓FIFO鐨勮鍒欙紝絎竴涓懡浠よ鍙傛暟鏄姹備粠FIFO璇誨嚭鐨勫瓧鑺傛暟

#include 
#include 
#include 
#include 
#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

鎶婂啓紼嬪簭緙栬瘧鎴愪袱涓洓涓増鏈細

闈為樆濉炰笖璇鋒眰鍐欑殑瀛楄妭鏁板ぇ浜嶱IPE_BUF鐗堟湰錛歯bwg

闈為樆濉炰笖璇鋒眰鍐欑殑瀛楄妭鏁頒笉澶т簬PIPE_BUF鐗堟湰錛氱増鏈琻bw

闃誨涓旇姹傚啓鐨勫瓧鑺傛暟澶т簬PIPE_BUF鐗堟湰錛歜wg

闃誨涓旇姹傚啓鐨勫瓧鑺傛暟涓嶅ぇ浜嶱IPE_BUF鐗堟湰錛氱増鏈琤w

涓嬮潰灝嗕嬌鐢╞r銆乶br銆亀浠f浛鐩稿簲紼嬪簭涓殑闃誨璇匯侀潪闃誨璇?

楠岃瘉闃誨鍐欐搷浣滐細

褰撹姹傚啓鍏ョ殑鏁版嵁閲忓ぇ浜嶱IPE_BUF鏃剁殑闈炲師瀛愭э細

nbr 1000 
bwg

褰撹姹傚啓鍏ョ殑鏁版嵁閲忎笉澶т簬PIPE_BUF鏃剁殑鍘熷瓙鎬э細

nbr 1000 
bw

楠岃瘉闈為樆濉炲啓鎿嶄綔錛?

褰撹姹傚啓鍏ョ殑鏁版嵁閲忓ぇ浜嶱IPE_BUF鏃剁殑闈炲師瀛愭э細

nbr 1000 
nbwg

璇鋒眰鍐欏叆鐨勬暟鎹噺涓嶅ぇ浜嶱IPE_BUF鏃剁殑鍘熷瓙鎬э細

nbr 1000 
nbw

涓嶇鍐欐墦寮鐨勯樆濉炴爣蹇楁槸鍚﹁緗紝鍦ㄨ姹傚啓鍏ョ殑瀛楄妭鏁板ぇ浜?096鏃訛紝閮戒笉淇濊瘉鍐欏叆鐨勫師瀛愭с備絾浜岃呮湁鏈川鍖哄埆錛?

瀵逛簬闃誨鍐欐潵璇達紝鍐欐搷浣滃湪鍐欐弧FIFO鐨勭┖闂插尯鍩熷悗錛屼細涓鐩寸瓑寰咃紝鐩村埌鍐欏畬鎵鏈夋暟鎹負姝紝璇鋒眰鍐欏叆鐨勬暟鎹渶緇堥兘浼氬啓鍏IFO錛?

鑰岄潪闃誨鍐欏垯鍦ㄥ啓婊IFO鐨勭┖闂插尯鍩熷悗錛屽氨榪斿洖(瀹為檯鍐欏叆鐨勫瓧鑺傛暟)錛屾墍浠ユ湁浜涙暟鎹渶緇堜笉鑳藉鍐欏叆銆?

瀵逛簬璇繪搷浣滅殑楠岃瘉鍒欐瘮杈冪畝鍗曪紝涓嶅啀璁ㄨ銆?

2.5鏈夊悕綆¢亾搴旂敤瀹炰緥

鍦ㄩ獙璇佷簡鐩稿簲鐨勮鍐欒鍒欏悗錛屽簲鐢ㄥ疄渚嬩技涔庡氨娌℃湁蹇呰浜嗐?

灝忕粨錛?/strong>

綆¢亾甯哥敤浜庝袱涓柟闈細錛?錛夊湪shell涓椂甯鎬細鐢ㄥ埌綆¢亾錛堜綔涓鴻緭鍏ヨ緭鍏ョ殑閲嶅畾鍚戯級錛屽湪榪欑搴旂敤鏂瑰紡涓嬶紝綆¢亾鐨勫垱寤哄浜庣敤鎴鋒潵璇存槸閫忔槑鐨勶紱錛?錛夌敤浜庡叿鏈変翰緙樺叧緋葷殑榪涚▼闂撮氫俊錛岀敤鎴瘋嚜宸卞垱寤虹閬擄紝騫跺畬鎴愯鍐欐搷浣溿?

FIFO鍙互璇存槸綆¢亾鐨勬帹騫匡紝鍏嬫湇浜嗙閬撴棤鍚嶅瓧鐨勯檺鍒訛紝浣垮緱鏃犱翰緙樺叧緋葷殑榪涚▼鍚屾牱鍙互閲囩敤鍏堣繘鍏堝嚭鐨勯氫俊鏈哄埗榪涜閫氫俊銆?

綆¢亾鍜孎IFO鐨勬暟鎹槸瀛楄妭嫻侊紝搴旂敤紼嬪簭涔嬮棿蹇呴』浜嬪厛紜畾鐗瑰畾鐨勪紶杈?鍗忚"錛岄噰鐢ㄤ紶鎾叿鏈夌壒瀹氭剰涔夌殑娑堟伅銆?

瑕佺伒媧誨簲鐢ㄧ閬撳強FIFO錛岀悊瑙e畠浠殑璇誨啓瑙勫垯鏄叧閿?

闄?錛歬ill -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

闄や簡鍦ㄦ澶勭敤鏉ヨ鏄庣閬撳簲鐢ㄥ錛屾帴涓嬫潵鐨勪笓棰樿繕瑕佸榪欎簺淇″彿鍒嗙被璁ㄨ銆?

闄?錛氬FIFO鎵撳紑瑙勫垯鐨勯獙璇侊紙涓昏楠岃瘉鍐欐墦寮瀵硅鎵撳紑鐨勪緷璧栨э級

#include 
#include 
#include 
#include 
#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;

}

鍙傝冩枃鐚細

UNIX緗戠粶緙栫▼絎簩鍗鳳細榪涚▼闂撮氫俊錛屼綔鑰咃細W.Richard Stevens錛岃瘧鑰咃細鏉ㄧ戶寮狅紝娓呭崕澶у鍑虹増紺俱備赴瀵岀殑UNIX榪涚▼闂撮氫俊瀹炰緥鍙婂垎鏋愶紝瀵筁inux鐜涓嬬殑紼嬪簭寮鍙戞湁鏋佸ぇ鐨勫惎鍙戞剰涔夈?

linux鍐呮牳婧愪唬鐮佹儏鏅垎鏋愶紙涓娿佷笅錛夛紝姣涘痙鎿嶃佽儭甯屾槑钁楋紝嫻欐睙澶у鍑虹増紺撅紝褰撹楠岃瘉鏌愪釜緇撹銆佹兂娉曟椂錛屾渶濂界殑鍙傝冭祫鏂欙紱

UNIX鐜楂樼駭緙栫▼錛屼綔鑰咃細W.Richard Stevens錛岃瘧鑰咃細灝ゆ檵鍏冪瓑錛屾満姊板伐涓氬嚭鐗堢ぞ銆傚叿鏈変赴瀵岀殑緙栫▼瀹炰緥錛屼互鍙婂叧閿嚱鏁頒即闅廢nix鐨勫彂灞曞巻紼嬨?

http://www.linux.org.tw/CLDP/gb/Secure-Programs-HOWTO/x346.html 鐐規槑linux涓媠igaction鐨勫疄鐜板熀紜錛宭inux婧愮爜../kernel/signal.c鏇磋鏄庝簡闂錛?

pipe鎵嬪唽錛屾渶鐩存帴鑰屽彲闈犵殑鍙傝冭祫鏂?

fifo鎵嬪唽錛屾渶鐩存帴鑰屽彲闈犵殑鍙傝冭祫鏂?

鍏充簬浣滆?/strong>

閮戝濺鍏達紝鐢鳳紝鐜版敾璇誨浗闃茬澶ц綆楁満瀛﹂櫌緗戠粶鏂瑰悜鍗氬+瀛︿綅銆傛偍鍙互閫氳繃鐢靛瓙閭歡 mlinux@163.com鍜屼粬鑱旂郴銆?



jackdong 2013-01-07 11:33 鍙戣〃璇勮
]]>
Linux涓嬬殑C璇█澶氱嚎紼嬬紪紼?/title><link>http://m.shnenglu.com/jackdongy/archive/2013/01/07/197061.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Mon, 07 Jan 2013 03:24:00 GMT</pubDate><guid>http://m.shnenglu.com/jackdongy/archive/2013/01/07/197061.html</guid><wfw:comment>http://m.shnenglu.com/jackdongy/comments/197061.html</wfw:comment><comments>http://m.shnenglu.com/jackdongy/archive/2013/01/07/197061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/jackdongy/comments/commentRss/197061.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/jackdongy/services/trackbacks/197061.html</trackback:ping><description><![CDATA[<strong><a >http://www.pcdog.com/edu/linux/13/11/y237287.html</a><br />寮曡█</strong> <p>    綰跨▼錛坱hread錛夋妧鏈棭鍦?0騫翠唬灝辮鎻愬嚭錛屼絾鐪熸搴旂敤<a target="_blank">澶氱嚎紼?/a>鍒?a target="_blank">鎿嶄綔緋葷粺</a>涓幓錛屾槸鍦?0騫翠唬涓湡錛?a target="_blank">solaris</a>鏄繖鏂歸潰鐨勪郊浣艱呫備紶緇熺殑Unix涔熸敮鎸佺嚎紼嬬殑姒傚康錛屼絾鏄湪涓涓繘紼嬶紙process錛変腑鍙厑璁告湁涓涓嚎紼嬶紝榪欐牱澶氱嚎紼嬪氨鎰忓懗鐫澶氳繘紼嬨傜幇鍦紝澶?/p> <p>    涓轟粈涔堟湁浜嗚繘紼嬬殑姒傚康鍚庯紝榪樿鍐嶅紩鍏ョ嚎紼嬪憿錛熶嬌鐢ㄥ綰跨▼鍒板簳鏈夊摢浜涘ソ澶勶紵浠涔堢殑緋葷粺搴旇閫夌敤澶氱嚎紼嬶紵鎴戜滑棣栧厛蹇呴』鍥炵瓟榪欎簺闂銆?</p> <p>    浣跨敤澶氱嚎紼嬬殑鐞嗙敱涔嬩竴鏄拰榪涚▼鐩告瘮錛屽畠鏄竴縐嶉潪甯?鑺備凱"鐨勫浠誨姟鎿嶄綔鏂瑰紡銆傛垜浠煡閬擄紝鍦?a target="_blank">Linux緋葷粺</a>涓嬶紝鍚姩涓涓柊鐨勮繘紼嬪繀欏誨垎閰嶇粰瀹冪嫭绔嬬殑鍦板潃絀洪棿錛屽緩绔嬩紬澶氱殑鏁版嵁琛ㄦ潵緇存姢瀹冪殑浠g爜孌點佸爢鏍堟鍜屾暟鎹錛岃繖鏄竴縐?鏄傝吹"鐨勫浠誨姟宸ヤ綔鏂瑰紡銆傝岃繍琛屼簬涓涓繘紼嬩腑鐨勫涓嚎紼嬶紝瀹冧滑褰兼涔嬮棿浣跨敤鐩稿悓鐨勫湴鍧絀洪棿錛屽叡浜ぇ閮ㄥ垎鏁版嵁錛屽惎鍔ㄤ竴涓嚎紼嬫墍鑺辮垂鐨勭┖闂磋繙榪滃皬浜庡惎鍔ㄤ竴涓繘紼嬫墍鑺辮垂鐨勭┖闂達紝鑰屼笖錛岀嚎紼嬮棿褰兼鍒囨崲鎵闇鐨勬椂闂翠篃榪滆繙灝忎簬榪涚▼闂村垏鎹㈡墍闇瑕佺殑鏃墮棿銆?/p> <p>    浣跨敤澶氱嚎紼嬬殑鐞嗙敱涔嬩簩鏄嚎紼嬮棿鏂逛究鐨勯氫俊鏈哄埗銆傚涓嶅悓榪涚▼鏉ヨ錛屽畠浠叿鏈夌嫭绔嬬殑鏁版嵁絀洪棿錛岃榪涜鏁版嵁鐨勪紶閫掑彧鑳介氳繃閫氫俊鐨勬柟寮忚繘琛岋紝榪欑鏂瑰紡涓嶄粎璐規椂錛岃屼笖寰堜笉鏂逛究銆傜嚎紼嬪垯涓嶇劧錛岀敱浜庡悓涓榪涚▼涓嬬殑綰跨▼涔嬮棿鍏變韓鏁版嵁絀洪棿錛屾墍浠ヤ竴涓嚎紼嬬殑鏁版嵁鍙互鐩存帴涓哄叾瀹冪嚎紼嬫墍鐢紝榪欎笉浠呭揩鎹鳳紝鑰屼笖鏂逛究銆傚綋鐒訛紝鏁版嵁鐨勫叡浜篃甯︽潵鍏朵粬涓浜涢棶棰橈紝鏈夌殑鍙橀噺涓嶈兘鍚屾椂琚袱涓嚎紼嬫墍淇敼錛屾湁鐨勫瓙紼嬪簭涓0鏄庝負static鐨勬暟鎹洿鏈夊彲鑳界粰澶氱嚎紼嬬▼搴忓甫鏉ョ伨闅炬х殑鎵撳嚮錛岃繖浜涙鏄紪鍐欏綰跨▼紼嬪簭鏃舵渶闇瑕佹敞鎰忕殑鍦版柟銆?/p> <p>    闄や簡浠ヤ笂鎵璇寸殑浼樼偣澶栵紝涓嶅拰榪涚▼姣旇緝錛屽綰跨▼紼嬪簭浣滀負涓縐嶅浠誨姟銆佸茍鍙戠殑宸ヤ綔鏂瑰紡錛屽綋鐒舵湁浠ヤ笅鐨勪紭鐐癸細 </p> <p>    1) 鎻愰珮搴旂敤紼嬪簭鍝嶅簲銆傝繖瀵瑰浘褰㈢晫闈㈢殑紼嬪簭灝ゅ叾鏈夋剰涔夛紝褰撲竴涓搷浣滆楁椂寰堥暱鏃訛紝鏁翠釜緋葷粺閮戒細絳夊緟榪欎釜鎿嶄綔錛屾鏃剁▼搴忎笉浼氬搷搴旈敭鐩樸侀紶鏍囥佽彍鍗曠殑鎿嶄綔錛岃屼嬌鐢ㄥ綰跨▼鎶鏈紝灝嗚楁椂闀跨殑鎿嶄綔錛坱ime consuming錛夌疆浜庝竴涓柊鐨勭嚎紼嬶紝鍙互閬垮厤榪欑灝村艾鐨勬儏鍐點?<br />    2) 浣垮CPU緋葷粺鏇村姞鏈夋晥銆傛搷浣滅郴緇熶細淇濊瘉褰撶嚎紼嬫暟涓嶅ぇ浜嶤PU鏁扮洰鏃訛紝涓嶅悓鐨勭嚎紼嬭繍琛屼簬涓嶅悓鐨凜PU涓娿?<br />    3) 鏀瑰杽紼嬪簭緇撴瀯銆備竴涓棦闀垮張澶嶆潅鐨勮繘紼嬪彲浠ヨ冭檻鍒嗕負澶氫釜綰跨▼錛屾垚涓哄嚑涓嫭绔嬫垨鍗婄嫭绔嬬殑榪愯閮ㄥ垎錛岃繖鏍風殑紼嬪簭浼氬埄浜庣悊瑙e拰淇敼銆?</p> <p>    涓嬮潰鎴戜滑鍏堟潵灝濊瘯緙栧啓涓涓畝鍗曠殑澶氱嚎紼嬬▼搴忋?br /><br /><strong>綆鍗曠殑</strong><a target="_blank"><strong>澶氱嚎紼?/strong></a><strong>緙栫▼ </strong></p> <p><strong>    </strong>Linux緋葷粺涓嬬殑澶氱嚎紼嬮伒寰狿OSIX綰跨▼鎺ュ彛錛岀О涓簆thread銆傜紪鍐橪inux涓嬬殑澶氱嚎紼嬬▼搴忥紝闇瑕佷嬌鐢ㄥご鏂囦歡pthread.h錛岃繛鎺ユ椂闇瑕佷嬌鐢ㄥ簱libpthread.a銆傞『渚胯涓涓嬶紝Linux涓媝thread鐨勫疄鐜版槸閫氳繃緋葷粺璋冪敤clone錛堬級鏉ュ疄鐜扮殑銆俢lone錛堬級鏄疞inux鎵鐗規湁鐨勭郴緇熻皟鐢紝瀹冪殑浣跨敤鏂瑰紡綾諱技fork錛屽叧浜巆lone錛堬級鐨勮緇嗘儏鍐碉紝鏈夊叴瓚g殑璇昏呭彲浠ュ幓鏌ョ湅鏈夊叧鏂囨。璇存槑銆備笅闈㈡垜浠睍紺轟竴涓渶綆鍗曠殑澶氱嚎紼嬬▼搴廵xample1.c銆?</p> <p> </p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>/* example.c*/ #include <stdio.h> #include <pthread.h> void thread(void) { int i; for(i=0;i<3;i++) printf("This is a pthread.\n"); } int main(void) { pthread_t id; int i,ret; ret=pthread_create(&id,NULL,(void *) thread,NULL); if(ret!=0){ printf ("Create pthread error!\n"); exit (1); } for(i=0;i<3;i++) printf("This is the main process.\n"); pthread_join(id,NULL); return (0); } </div> </pre></div> <p> </p> <p>    鎴戜滑緙栬瘧姝ょ▼搴忥細 <br />    gcc example1.c -lpthread -o example1 <br />    榪愯example1錛屾垜浠緱鍒板涓嬬粨鏋滐細 <br />    This is the main process. <br />    This is a pthread. <br />    This is the main process. <br />    This is the main process. <br />    This is a pthread. <br />    This is a pthread. <br />    鍐嶆榪愯錛屾垜浠彲鑳藉緱鍒板涓嬬粨鏋滐細 <br />    This is a pthread. <br />    This is the main process. <br />    This is a pthread. <br />    This is the main process. <br />    This is a pthread. <br />    This is the main process. <br /><br />    鍓嶅悗涓ゆ緇撴灉涓嶄竴鏍鳳紝榪欐槸涓や釜綰跨▼浜夊ずCPU璧勬簮鐨勭粨鏋溿備笂闈㈢殑紺轟緥涓紝鎴戜滑浣跨敤鍒頒簡涓や釜鍑芥暟錛屻銆pthread_create鍜宲thread_join錛屽茍澹版槑浜嗕竴涓猵thread_t鍨嬬殑鍙橀噺銆?<br />    pthread_t鍦ㄥご鏂囦歡/usr/include/bits/pthreadtypes.h涓畾涔夛細 <br />    typedef unsigned long int pthread_t; <br />    瀹冩槸涓涓嚎紼嬬殑鏍囪瘑絎︺傚嚱鏁皃thread_create鐢ㄦ潵鍒涘緩涓涓嚎紼嬶紝瀹冪殑鍘熷瀷涓猴細 <br />    extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr, <br />    void *(*__start_routine) (void *), void *__arg)); <br />    絎竴涓弬鏁頒負鎸囧悜綰跨▼鏍囪瘑絎︾殑鎸囬拡錛岀浜屼釜鍙傛暟鐢ㄦ潵璁劇疆綰跨▼灞炴э紝絎笁涓弬鏁版槸綰跨▼榪愯鍑芥暟鐨勮搗濮嬪湴鍧錛屾渶鍚庝竴涓弬鏁版槸榪愯鍑芥暟鐨勫弬鏁般傝繖閲岋紝鎴戜滑鐨勫嚱鏁皌hread涓嶉渶瑕佸弬鏁幫紝鎵浠ユ渶鍚庝竴涓弬鏁拌涓虹┖鎸囬拡銆傜浜屼釜鍙傛暟鎴戜滑涔熻涓虹┖鎸囬拡錛岃繖鏍峰皢鐢熸垚榛樿灞炴х殑綰跨▼銆傚綰跨▼灞炴х殑璁懼畾鍜屼慨鏀規垜浠皢鍦ㄤ笅涓鑺傞槓榪般傚綋鍒涘緩綰跨▼鎴愬姛鏃訛紝鍑芥暟榪斿洖0錛岃嫢涓嶄負0鍒欒鏄庡垱寤虹嚎紼嬪け璐ワ紝甯歌鐨勯敊璇繑鍥炰唬鐮佷負EAGAIN鍜孍INVAL銆傚墠鑰呰〃紺虹郴緇熼檺鍒跺垱寤烘柊鐨勭嚎紼嬶紝渚嬪綰跨▼鏁扮洰榪囧浜嗭紱鍚庤呰〃紺虹浜屼釜鍙傛暟浠h〃鐨勭嚎紼嬪睘鎬у奸潪娉曘傚垱寤虹嚎紼嬫垚鍔熷悗錛屾柊鍒涘緩鐨勭嚎紼嬪垯榪愯鍙傛暟涓夊拰鍙傛暟鍥涚‘瀹氱殑鍑芥暟錛屽師鏉ョ殑綰跨▼鍒欑戶緇繍琛屼笅涓琛屼唬鐮併?/p> <p>    鍑芥暟pthread_join鐢ㄦ潵絳夊緟涓涓嚎紼嬬殑緇撴潫銆傚嚱鏁板師鍨嬩負錛?<br />    extern int pthread_join __P ((pthread_t __th, void **__thread_return)); </p> <p>    絎竴涓弬鏁頒負琚瓑寰呯殑綰跨▼鏍囪瘑絎︼紝絎簩涓弬鏁頒負涓涓敤鎴峰畾涔夌殑鎸囬拡錛屽畠鍙互鐢ㄦ潵瀛樺偍琚瓑寰呯嚎紼嬬殑榪斿洖鍊箋傝繖涓嚱鏁版槸涓涓嚎紼嬮樆濉炵殑鍑芥暟錛岃皟鐢ㄥ畠鐨勫嚱鏁板皢涓鐩寸瓑寰呭埌琚瓑寰呯殑綰跨▼緇撴潫涓烘錛屽綋鍑芥暟榪斿洖鏃訛紝琚瓑寰呯嚎紼嬬殑璧勬簮琚敹鍥炪備竴涓嚎紼嬬殑緇撴潫鏈変袱縐嶉斿緞錛屼竴縐嶆槸璞℃垜浠笂闈㈢殑渚嬪瓙涓鏍鳳紝鍑芥暟緇撴潫浜嗭紝璋冪敤瀹冪殑綰跨▼涔熷氨緇撴潫浜嗭紱鍙︿竴縐嶆柟寮忔槸閫氳繃鍑芥暟pthread_exit鏉ュ疄鐜般傚畠鐨勫嚱鏁板師鍨嬩負錛?<br />銆銆extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__)); </p> <p>    鍞竴鐨勫弬鏁版槸鍑芥暟鐨勮繑鍥炰唬鐮侊紝鍙pthread_join涓殑絎簩涓弬鏁皌hread_return涓嶆槸NULL錛岃繖涓煎皢琚紶閫掔粰thread_return銆傛渶鍚庤璇存槑鐨勬槸錛屼竴涓嚎紼嬩笉鑳借澶氫釜綰跨▼絳夊緟錛屽惁鍒欑涓涓帴鏀跺埌淇″彿鐨勭嚎紼嬫垚鍔熻繑鍥烇紝鍏朵綑璋冪敤pthread_join鐨勭嚎紼嬪垯榪斿洖閿欒浠g爜ESRCH銆?</p> <p>    鍦ㄨ繖涓鑺傞噷錛屾垜浠紪鍐欎簡涓涓渶綆鍗曠殑綰跨▼錛屽茍鎺屾彙浜嗘渶甯哥敤鐨勪笁涓嚱鏁皃thread_create錛宲thread_join鍜宲thread_exit銆備笅闈紝鎴戜滑鏉ヤ簡瑙g嚎紼嬬殑涓浜涘父鐢ㄥ睘鎬т互鍙婂浣曡緗繖浜涘睘鎬с?/p> <p> </p><strong>淇敼綰跨▼鐨勫睘鎬?</strong> <p>    鍦ㄤ笂涓鑺傜殑渚嬪瓙閲岋紝鎴戜滑鐢╬thread_create鍑芥暟鍒涘緩浜嗕竴涓嚎紼嬶紝鍦ㄨ繖涓嚎紼嬩腑錛屾垜浠嬌鐢ㄤ簡榛樿鍙傛暟錛屽嵆灝嗚鍑芥暟鐨勭浜屼釜鍙傛暟璁句負NULL銆傜殑紜紝瀵瑰ぇ澶氭暟紼嬪簭鏉ヨ錛屼嬌鐢ㄩ粯璁ゅ睘鎬у氨澶熶簡錛屼絾鎴戜滑榪樻槸鏈夊繀瑕佹潵浜嗚В涓涓嬬嚎紼嬬殑鏈夊叧灞炴с?</p> <p>    灞炴х粨鏋勪負pthread_attr_t錛屽畠鍚屾牱鍦ㄥご鏂囦歡/usr/include/pthread.h涓畾涔夛紝鍠滄榪芥牴闂簳鐨勪漢鍙互鑷繁鍘繪煡鐪嬨傚睘鎬у間笉鑳界洿鎺ヨ緗紝欏諱嬌鐢ㄧ浉鍏沖嚱鏁拌繘琛屾搷浣滐紝鍒濆鍖栫殑鍑芥暟涓簆thread_attr_init錛岃繖涓嚱鏁板繀欏誨湪pthread_create鍑芥暟涔嬪墠璋冪敤銆傚睘鎬у璞′富瑕佸寘鎷槸鍚︾粦瀹氥佹槸鍚﹀垎紱匯佸爢鏍堝湴鍧銆佸爢鏍堝ぇ灝忋佷紭鍏堢駭銆傞粯璁ょ殑灞炴т負闈炵粦瀹氥侀潪鍒嗙銆佺己鐪?M鐨勫爢鏍堛佷笌鐖惰繘紼嬪悓鏍風駭鍒殑浼樺厛綰с?</p> <p>    鍏充簬綰跨▼鐨勭粦瀹氾紝鐗墊秹鍒板彟澶栦竴涓蹇碉細杞昏繘紼嬶紙LWP錛歀ight Weight Process錛夈傝交榪涚▼鍙互鐞嗚В涓哄唴鏍哥嚎紼嬶紝瀹冧綅浜庣敤鎴峰眰鍜岀郴緇熷眰涔嬮棿銆傜郴緇熷綰跨▼璧勬簮鐨勫垎閰嶃佸綰跨▼鐨勬帶鍒舵槸閫氳繃杞昏繘紼嬫潵瀹炵幇鐨勶紝涓涓交榪涚▼鍙互鎺у埗涓涓垨澶氫釜綰跨▼銆傞粯璁ょ姸鍐典笅錛屽惎鍔ㄥ灝戣交榪涚▼銆佸摢浜涜交榪涚▼鏉ユ帶鍒跺摢浜涚嚎紼嬫槸鐢辯郴緇熸潵鎺у埗鐨勶紝榪欑鐘跺喌鍗崇О涓洪潪緇戝畾鐨勩傜粦瀹氱姸鍐典笅錛屽垯欏懼悕鎬濅箟錛屽嵆鏌愪釜綰跨▼鍥哄畾鐨?緇?鍦ㄤ竴涓交榪涚▼涔嬩笂銆傝緇戝畾鐨勭嚎紼嬪叿鏈夎緝楂樼殑鍝嶅簲閫熷害錛岃繖鏄洜涓篊PU鏃墮棿鐗囩殑璋冨害鏄潰鍚戣交榪涚▼鐨勶紝緇戝畾鐨勭嚎紼嬪彲浠ヤ繚璇佸湪闇瑕佺殑鏃跺欏畠鎬繪湁涓涓交榪涚▼鍙敤銆傞氳繃璁劇疆琚粦瀹氱殑杞昏繘紼嬬殑浼樺厛綰у拰璋冨害綰у彲浠ヤ嬌寰楃粦瀹氱殑綰跨▼婊¤凍璇稿瀹炴椂鍙嶅簲涔嬬被鐨勮姹傘?</p> <p>    璁劇疆綰跨▼緇戝畾鐘舵佺殑鍑芥暟涓簆thread_attr_setscope錛屽畠鏈変袱涓弬鏁幫紝絎竴涓槸鎸囧悜灞炴х粨鏋勭殑鎸囬拡錛岀浜屼釜鏄粦瀹氱被鍨嬶紝瀹冩湁涓や釜鍙栧鹼細PTHREAD_SCOPE_SYSTEM錛堢粦瀹氱殑錛夊拰PTHREAD_SCOPE_PROCESS錛堥潪緇戝畾鐨勶級銆備笅闈㈢殑浠g爜鍗沖垱寤轟簡涓涓粦瀹氱殑綰跨▼銆?</p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>#include <pthread.h> pthread_attr_t attr; pthread_t tid; /*鍒濆鍖栧睘鎬у鹼紝鍧囪涓洪粯璁ゅ?/ pthread_attr_init(&attr); pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); pthread_create(&tid, &attr, (void *) my_function, NULL); </div> </pre></div> <p>    綰跨▼鐨勫垎紱葷姸鎬佸喅瀹氫竴涓嚎紼嬩互浠涔堟牱鐨勬柟寮忔潵緇堟鑷繁銆傚湪涓婇潰鐨勪緥瀛愪腑錛屾垜浠噰鐢ㄤ簡綰跨▼鐨勯粯璁ゅ睘鎬э紝鍗充負闈炲垎紱葷姸鎬侊紝榪欑鎯呭喌涓嬶紝鍘熸湁鐨勭嚎紼嬬瓑寰呭垱寤虹殑綰跨▼緇撴潫銆傚彧鏈夊綋pthread_join錛堬級鍑芥暟榪斿洖鏃訛紝鍒涘緩鐨勭嚎紼嬫墠綆楃粓姝紝鎵嶈兘閲婃斁鑷繁鍗犵敤鐨勭郴緇熻祫婧愩傝屽垎紱葷嚎紼嬩笉鏄繖鏍峰瓙鐨勶紝瀹冩病鏈夎鍏朵粬鐨勭嚎紼嬫墍絳夊緟錛岃嚜宸辮繍琛岀粨鏉熶簡錛岀嚎紼嬩篃灝辯粓姝簡錛岄┈涓婇噴鏀劇郴緇熻祫婧愩傜▼搴忓憳搴旇鏍規嵁鑷繁鐨勯渶瑕侊紝閫夋嫨閫傚綋鐨勫垎紱葷姸鎬併傝緗嚎紼嬪垎紱葷姸鎬佺殑鍑芥暟涓簆thread_attr_setdetachstate錛坧thread_attr_t *attr, int detachstate錛夈傜浜屼釜鍙傛暟鍙変負PTHREAD_CREATE_DETACHED錛堝垎紱葷嚎紼嬶級鍜?PTHREAD _CREATE_JOINABLE錛堥潪鍒嗙綰跨▼錛夈傝繖閲岃娉ㄦ剰鐨勪竴鐐規槸錛屽鏋滆緗竴涓嚎紼嬩負鍒嗙綰跨▼錛岃岃繖涓嚎紼嬭繍琛屽張闈炲父蹇紝瀹冨緢鍙兘鍦╬thread_create鍑芥暟榪斿洖涔嬪墠灝辯粓姝簡錛屽畠緇堟浠ュ悗灝卞彲鑳藉皢綰跨▼鍙峰拰緋葷粺璧勬簮縐諱氦緇欏叾浠栫殑綰跨▼浣跨敤錛岃繖鏍瘋皟鐢╬thread_create鐨勭嚎紼嬪氨寰楀埌浜嗛敊璇殑綰跨▼鍙楓傝閬垮厤榪欑鎯呭喌鍙互閲囧彇涓瀹氱殑鍚屾鎺柦錛屾渶綆鍗曠殑鏂規硶涔嬩竴鏄彲浠ュ湪琚垱寤虹殑綰跨▼閲岃皟鐢╬thread_cond_timewait鍑芥暟錛岃榪欎釜綰跨▼絳夊緟涓浼氬効錛岀暀鍑鴻凍澶熺殑鏃墮棿璁╁嚱鏁皃thread_create榪斿洖銆傝緗竴孌電瓑寰呮椂闂達紝鏄湪<a target="_blank">澶氱嚎紼?/a>緙栫▼閲屽父鐢ㄧ殑鏂規硶銆備絾鏄敞鎰忎笉瑕佷嬌鐢ㄨ濡倃ait錛堬級涔嬬被鐨勫嚱鏁幫紝瀹冧滑鏄嬌鏁翠釜榪涚▼鐫$湢錛屽茍涓嶈兘瑙e喅綰跨▼鍚屾鐨勯棶棰樸?</p> <p>    鍙﹀涓涓彲鑳藉父鐢ㄧ殑灞炴ф槸綰跨▼鐨勪紭鍏堢駭錛屽畠瀛樻斁鍦ㄧ粨鏋剆ched_param涓傜敤鍑芥暟pthread_attr_getschedparam鍜屽嚱鏁皃thread_attr_setschedparam榪涜瀛樻斁錛屼竴鑸鏉ワ紝鎴戜滑鎬繪槸鍏堝彇浼樺厛綰э紝瀵瑰彇寰楃殑鍊間慨鏀瑰悗鍐嶅瓨鏀懼洖鍘匯備笅闈㈠嵆鏄竴孌電畝鍗曠殑渚嬪瓙銆?</p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>#include <pthread.h> #include <sched.h> pthread_attr_t attr; pthread_t tid; sched_param param; int newprio=20; pthread_attr_init(&attr); pthread_attr_getschedparam(&attr, &param); param.sched_priority=newprio; pthread_attr_setschedparam(&attr, &param); pthread_create(&tid, &attr, (void *)myfunction, myarg); </div> </pre></div><br /><strong>綰跨▼鐨勬暟鎹鐞?/strong> <p>    鍜岃繘紼嬬浉姣旓紝綰跨▼鐨勬渶澶т紭鐐逛箣涓鏄暟鎹殑鍏變韓鎬э紝鍚勪釜榪涚▼鍏變韓鐖惰繘紼嬪娌胯鐨勬暟鎹錛屽彲浠ユ柟渚跨殑鑾峰緱銆佷慨鏀規暟鎹備絾榪欎篃緇?a target="_blank">澶氱嚎紼?/a>緙栫▼甯︽潵浜嗚澶氶棶棰樸傛垜浠繀欏誨綋蹇冩湁澶氫釜涓嶅悓鐨勮繘紼嬭闂浉鍚岀殑鍙橀噺銆傝澶氬嚱鏁版槸涓嶅彲閲嶅叆鐨勶紝鍗沖悓鏃朵笉鑳借繍琛屼竴涓嚱鏁扮殑澶氫釜鎷瘋礉錛堥櫎闈炰嬌鐢ㄤ笉鍚岀殑鏁版嵁孌碉級銆傚湪鍑芥暟涓0鏄庣殑闈欐佸彉閲忓父甯稿甫鏉ラ棶棰橈紝鍑芥暟鐨勮繑鍥炲間篃浼氭湁闂銆傚洜涓哄鏋滆繑鍥炵殑鏄嚱鏁板唴閮ㄩ潤鎬佸0鏄庣殑絀洪棿鐨勫湴鍧錛屽垯鍦ㄤ竴涓嚎紼嬭皟鐢ㄨ鍑芥暟寰楀埌鍦板潃鍚庝嬌鐢ㄨ鍦板潃鎸囧悜鐨勬暟鎹椂錛屽埆鐨勭嚎紼嬪彲鑳借皟鐢ㄦ鍑芥暟騫朵慨鏀逛簡榪欎竴孌墊暟鎹傚湪榪涚▼涓叡浜殑鍙橀噺蹇呴』鐢ㄥ叧閿瓧volatile鏉ュ畾涔夛紝榪欐槸涓轟簡闃叉緙栬瘧鍣ㄥ湪浼樺寲鏃訛紙濡俫cc涓嬌鐢?OX鍙傛暟錛夋敼鍙樺畠浠殑浣跨敤鏂瑰紡銆備負浜嗕繚鎶ゅ彉閲忥紝鎴戜滑蹇呴』浣跨敤淇″彿閲忋佷簰鏂ョ瓑鏂規硶鏉ヤ繚璇佹垜浠鍙橀噺鐨勬紜嬌鐢ㄣ備笅闈紝鎴戜滑灝遍愭浠嬬粛澶勭悊綰跨▼鏁版嵁鏃剁殑鏈夊叧鐭ヨ瘑銆?<br /><br />    <strong>4.1 綰跨▼鏁版嵁</strong></p> <p><strong>    </strong>鍦ㄥ崟綰跨▼鐨勭▼搴忛噷錛屾湁涓ょ鍩烘湰鐨勬暟鎹細鍏ㄥ眬鍙橀噺鍜屽眬閮ㄥ彉閲忋備絾鍦ㄥ綰跨▼紼嬪簭閲岋紝榪樻湁絎笁縐嶆暟鎹被鍨嬶細綰跨▼鏁版嵁錛圱SD: Thread-Specific Data錛夈傚畠鍜屽叏灞鍙橀噺寰堣薄錛屽湪綰跨▼鍐呴儴錛屽悇涓嚱鏁板彲浠ヨ薄浣跨敤鍏ㄥ眬鍙橀噺涓鏍瘋皟鐢ㄥ畠錛屼絾瀹冨綰跨▼澶栭儴鐨勫叾瀹冪嚎紼嬫槸涓嶅彲瑙佺殑銆傝繖縐嶆暟鎹殑蹇呰鎬ф槸鏄捐屾槗瑙佺殑銆備緥濡傛垜浠父瑙佺殑鍙橀噺errno錛屽畠榪斿洖鏍囧噯鐨勫嚭閿欎俊鎭傚畠鏄劇劧涓嶈兘鏄竴涓眬閮ㄥ彉閲忥紝鍑犱箮姣忎釜鍑芥暟閮藉簲璇ュ彲浠ヨ皟鐢ㄥ畠錛涗絾瀹冨張涓嶈兘鏄竴涓叏灞鍙橀噺錛屽惁鍒欏湪A綰跨▼閲岃緭鍑虹殑寰堝彲鑳芥槸B綰跨▼鐨勫嚭閿欎俊鎭傝瀹炵幇璇稿姝ょ被鐨勫彉閲忥紝鎴戜滑灝卞繀欏諱嬌鐢ㄧ嚎紼嬫暟鎹傛垜浠負姣忎釜綰跨▼鏁版嵁鍒涘緩涓涓敭錛屽畠鍜岃繖涓敭鐩稿叧鑱旓紝鍦ㄥ悇涓嚎紼嬮噷錛岄兘浣跨敤榪欎釜閿潵鎸囦唬綰跨▼鏁版嵁錛屼絾鍦ㄤ笉鍚岀殑綰跨▼閲岋紝榪欎釜閿唬琛ㄧ殑鏁版嵁鏄笉鍚岀殑錛屽湪鍚屼竴涓嚎紼嬮噷錛屽畠浠h〃鍚屾牱鐨勬暟鎹唴瀹廣?</p> <p>    鍜岀嚎紼嬫暟鎹浉鍏崇殑鍑芥暟涓昏鏈?涓細鍒涘緩涓涓敭錛涗負涓涓敭鎸囧畾綰跨▼鏁版嵁錛涗粠涓涓敭璇誨彇綰跨▼鏁版嵁錛涘垹闄ら敭銆?<br />    鍒涘緩閿殑鍑芥暟鍘熷瀷涓猴細 <br />    extern int pthread_key_create __P ((pthread_key_t *__key, <br />    void (*__destr_function) (void *))); </p> <p>    絎竴涓弬鏁頒負鎸囧悜涓涓敭鍊肩殑鎸囬拡錛岀浜屼釜鍙傛暟鎸囨槑浜嗕竴涓猟estructor鍑芥暟錛屽鏋滆繖涓弬鏁頒笉涓虹┖錛岄偅涔堝綋姣忎釜綰跨▼緇撴潫鏃訛紝緋葷粺灝嗚皟鐢ㄨ繖涓嚱鏁版潵閲婃斁緇戝畾鍦ㄨ繖涓敭涓婄殑鍐呭瓨鍧椼傝繖涓嚱鏁板父鍜屽嚱鏁皃thread_once ((pthread_once_t*once_control, void (*initroutine) (void)))涓璧蜂嬌鐢紝涓轟簡璁╄繖涓敭鍙鍒涘緩涓嬈°傚嚱鏁皃thread_once澹版槑涓涓垵濮嬪寲鍑芥暟錛岀涓嬈¤皟鐢╬thread_once鏃跺畠鎵ц榪欎釜鍑芥暟錛屼互鍚庣殑璋冪敤灝嗚瀹冨拷鐣ャ?<br /><br />    鍦ㄤ笅闈㈢殑渚嬪瓙涓紝鎴戜滑鍒涘緩涓涓敭錛屽茍灝嗗畠鍜屾煇涓暟鎹浉鍏寵仈銆傛垜浠瀹氫箟涓涓嚱鏁癱reateWindow錛岃繖涓嚱鏁板畾涔変竴涓浘褰㈢獥鍙o紙鏁版嵁綾誨瀷涓篎l_Window *錛岃繖鏄浘褰㈢晫闈㈠紑鍙戝伐鍏稦LTK涓殑鏁版嵁綾誨瀷錛夈傜敱浜庡悇涓嚎紼嬮兘浼氳皟鐢ㄨ繖涓嚱鏁幫紝鎵浠ユ垜浠嬌鐢ㄧ嚎紼嬫暟鎹?</p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>/* 澹版槑涓涓敭*/ pthread_key_t myWinKey; /* 鍑芥暟 createWindow */ void createWindow ( void ) { Fl_Window * win; static pthread_once_t once= PTHREAD_ONCE_INIT; /* 璋冪敤鍑芥暟createMyKey錛屽垱寤洪敭*/ pthread_once ( & once, createMyKey) ; /*win鎸囧悜涓涓柊寤虹珛鐨勭獥鍙?/ win=new Fl_Window( 0, 0, 100, 100, "MyWindow"); /* 瀵規紿楀彛浣滀竴浜涘彲鑳界殑璁劇疆宸ヤ綔錛屽澶у皬銆佷綅緗佸悕縐扮瓑*/ setWindow(win); /* 灝嗙獥鍙f寚閽堝肩粦瀹氬湪閿甿yWinKey涓?/ pthread_setpecific ( myWinKey, win); } /* 鍑芥暟 createMyKey錛屽垱寤轟竴涓敭錛屽茍鎸囧畾浜哾estructor */ void createMyKey ( void ) { pthread_keycreate(&myWinKey, freeWinKey); } /* 鍑芥暟 freeWinKey錛岄噴鏀劇┖闂?/ void freeWinKey ( Fl_Window * win){ delete win; } </div> </pre></div> <p>    榪欐牱錛屽湪涓嶅悓鐨勭嚎紼嬩腑璋冪敤鍑芥暟createMyWin錛岄兘鍙互寰楀埌鍦ㄧ嚎紼嬪唴閮ㄥ潎鍙鐨勭獥鍙e彉閲忥紝榪欎釜鍙橀噺閫氳繃鍑芥暟pthread_getspecific寰楀埌銆傚湪涓婇潰鐨勪緥瀛愪腑錛屾垜浠凡緇忎嬌鐢ㄤ簡鍑芥暟pthread_setspecific鏉ュ皢綰跨▼鏁版嵁鍜屼竴涓敭緇戝畾鍦ㄤ竴璧楓傝繖涓や釜鍑芥暟鐨勫師鍨嬪涓嬶細 <br />    extern int pthread_setspecific __P ((pthread_key_t __key,__const void *__pointer)); <br />    extern void *pthread_getspecific __P ((pthread_key_t __key)); </p> <p>    榪欎袱涓嚱鏁扮殑鍙傛暟鎰忎箟鍜屼嬌鐢ㄦ柟娉曟槸鏄捐屾槗瑙佺殑銆傝娉ㄦ剰鐨勬槸錛岀敤pthread_setspecific涓轟竴涓敭鎸囧畾鏂扮殑綰跨▼鏁版嵁鏃訛紝蹇呴』鑷繁閲婃斁鍘熸湁鐨勭嚎紼嬫暟鎹互鍥炴敹絀洪棿銆傝繖涓繃紼嬪嚱鏁皃thread_key_delete鐢ㄦ潵鍒犻櫎涓涓敭錛岃繖涓敭鍗犵敤鐨勫唴瀛樺皢琚噴鏀撅紝浣嗗悓鏍瘋娉ㄦ剰鐨勬槸錛屽畠鍙噴鏀鵑敭鍗犵敤鐨勫唴瀛橈紝騫朵笉閲婃斁璇ラ敭鍏寵仈鐨勭嚎紼嬫暟鎹墍鍗犵敤鐨勫唴瀛樿祫婧愶紝鑰屼笖瀹冧篃涓嶄細瑙﹀彂鍑芥暟pthread_key_create涓畾涔夌殑destructor鍑芥暟銆傜嚎紼嬫暟鎹殑閲婃斁蹇呴』鍦ㄩ噴鏀鵑敭涔嬪墠瀹屾垚銆?/p><br />  <strong>4.2 浜掓枼閿?/strong> <p>    浜掓枼閿佺敤鏉ヤ繚璇佷竴孌墊椂闂村唴鍙湁涓涓嚎紼嬪湪鎵ц涓孌典唬鐮併傚繀瑕佹ф樉鑰屾槗瑙侊細鍋囪鍚勪釜綰跨▼鍚戝悓涓涓枃浠墮『搴忓啓鍏ユ暟鎹紝鏈鍚庡緱鍒扮殑緇撴灉涓瀹氭槸鐏鵑毦鎬х殑銆?</p> <p>    鎴戜滑鍏堢湅涓嬮潰涓孌典唬鐮併傝繖鏄竴涓/鍐欑▼搴忥紝瀹冧滑鍏敤涓涓紦鍐插尯錛屽茍涓旀垜浠亣瀹氫竴涓紦鍐插尯鍙兘淇濆瓨涓鏉′俊鎭傚嵆緙撳啿鍖哄彧鏈変袱涓姸鎬侊細鏈変俊鎭垨娌℃湁淇℃伅銆?</p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>void reader_function ( void ); void writer_function ( void ); char buffer; int buffer_has_item=0; pthread_mutex_t mutex; struct timespec delay; void main ( void ){ pthread_t reader; /* 瀹氫箟寤惰繜鏃墮棿*/ delay.tv_sec = 2; delay.tv_nec = 0; /* 鐢ㄩ粯璁ゅ睘鎬у垵濮嬪寲涓涓簰鏂ラ攣瀵硅薄*/ pthread_mutex_init (&mutex,NULL); pthread_create(&reader, pthread_attr_default, (void *)&reader_function), NULL); writer_function( ); } void writer_function (void){ while(1){ /* 閿佸畾浜掓枼閿?/ pthread_mutex_lock (&mutex); if (buffer_has_item==0){ buffer=make_new_item( ); buffer_has_item=1; } /* 鎵撳紑浜掓枼閿?/ pthread_mutex_unlock(&mutex); pthread_delay_np(&delay); } } void reader_function(void){ while(1){ pthread_mutex_lock(&mutex); if(buffer_has_item==1){ consume_item(buffer); buffer_has_item=0; } pthread_mutex_unlock(&mutex); pthread_delay_np(&delay); } } </div> </pre></div> <p>    榪欓噷澹版槑浜嗕簰鏂ラ攣鍙橀噺mutex錛岀粨鏋刾thread_mutex_t涓轟笉鍏紑鐨勬暟鎹被鍨嬶紝鍏朵腑鍖呭惈涓涓郴緇熷垎閰嶇殑灞炴у璞°傚嚱鏁皃thread_mutex_init鐢ㄦ潵鐢熸垚涓涓簰鏂ラ攣銆侼ULL鍙傛暟琛ㄦ槑浣跨敤榛樿灞炴с傚鏋滈渶瑕佸0鏄庣壒瀹氬睘鎬х殑浜掓枼閿侊紝欏昏皟鐢ㄥ嚱鏁皃thread_mutexattr_init銆傚嚱鏁皃thread_mutexattr_setpshared鍜屽嚱鏁皃thread_mutexattr_settype鐢ㄦ潵璁劇疆浜掓枼閿佸睘鎬с傚墠涓涓嚱鏁拌緗睘鎬shared錛屽畠鏈変袱涓彇鍊鹼紝PTHREAD_PROCESS_PRIVATE鍜孭THREAD_PROCESS_SHARED銆傚墠鑰呯敤鏉ヤ笉鍚岃繘紼嬩腑鐨勭嚎紼嬪悓姝ワ紝鍚庤呯敤浜庡悓姝ユ湰榪涚▼鐨勪笉鍚岀嚎紼嬨傚湪涓婇潰鐨勪緥瀛愪腑錛屾垜浠嬌鐢ㄧ殑鏄粯璁ゅ睘鎬THREAD_PROCESS_ PRIVATE銆傚悗鑰呯敤鏉ヨ緗簰鏂ラ攣綾誨瀷錛屽彲閫夌殑綾誨瀷鏈塒THREAD_MUTEX_NORMAL銆丳THREAD_MUTEX_ERRORCHECK銆丳THREAD_MUTEX_RECURSIVE鍜孭THREAD _MUTEX_DEFAULT銆傚畠浠垎鍒畾涔変簡涓嶅悓鐨勪笂鎵銆佽В閿佹満鍒訛紝涓鑸儏鍐典笅錛岄夌敤鏈鍚庝竴涓粯璁ゅ睘鎬с?</p> <p>    pthread_mutex_lock澹版槑寮濮嬬敤浜掓枼閿佷笂閿侊紝姝ゅ悗鐨勪唬鐮佺洿鑷寵皟鐢╬thread_mutex_unlock涓烘錛屽潎琚笂閿侊紝鍗沖悓涓鏃墮棿鍙兘琚竴涓嚎紼嬭皟鐢ㄦ墽琛屻傚綋涓涓嚎紼嬫墽琛屽埌pthread_mutex_lock澶勬椂錛屽鏋滆閿佹鏃惰鍙︿竴涓嚎紼嬩嬌鐢紝閭f綰跨▼琚樆濉烇紝鍗崇▼搴忓皢絳夊緟鍒板彟涓涓嚎紼嬮噴鏀炬浜掓枼閿併傚湪涓婇潰鐨勪緥瀛愪腑錛屾垜浠嬌鐢ㄤ簡pthread_delay_np鍑芥暟錛岃綰跨▼鐫$湢涓孌墊椂闂達紝灝辨槸涓轟簡闃叉涓涓嚎紼嬪緇堝崰鎹鍑芥暟銆?</p> <p>    涓婇潰鐨勪緥瀛愰潪甯哥畝鍗曪紝灝變笉鍐嶄粙緇嶄簡錛岄渶瑕佹彁鍑虹殑鏄湪浣跨敤浜掓枼閿佺殑榪囩▼涓緢鏈夊彲鑳戒細鍑虹幇姝婚攣錛氫袱涓嚎紼嬭瘯鍥懼悓鏃跺崰鐢ㄤ袱涓祫婧愶紝騫舵寜涓嶅悓鐨勬搴忛攣瀹氱浉搴旂殑浜掓枼閿侊紝渚嬪涓や釜綰跨▼閮介渶瑕侀攣瀹氫簰鏂ラ攣1鍜屼簰鏂ラ攣2錛宎綰跨▼鍏堥攣瀹氫簰鏂ラ攣1錛宐綰跨▼鍏堥攣瀹氫簰鏂ラ攣2錛岃繖鏃跺氨鍑虹幇浜嗘閿併傛鏃舵垜浠彲浠ヤ嬌鐢ㄥ嚱鏁皃thread_mutex_trylock錛屽畠鏄嚱鏁皃thread_mutex_lock鐨勯潪闃誨鐗堟湰錛屽綋瀹冨彂鐜版閿佷笉鍙伩鍏嶆椂錛屽畠浼氳繑鍥炵浉搴旂殑淇℃伅錛岀▼搴忓憳鍙互閽堝姝婚攣鍋氬嚭鐩稿簲鐨勫鐞嗐傚彟澶栦笉鍚岀殑浜掓枼閿佺被鍨嬪姝婚攣鐨勫鐞嗕笉涓鏍鳳紝浣嗘渶涓昏鐨勮繕鏄紼嬪簭鍛樿嚜宸卞湪紼嬪簭璁捐娉ㄦ剰榪欎竴鐐廣?/p><br /><strong>4.3 鏉′歡鍙橀噺 </strong> <p><strong>    </strong>鍓嶄竴鑺備腑鎴戜滑璁茶堪浜嗗浣曚嬌鐢ㄤ簰鏂ラ攣鏉ュ疄鐜扮嚎紼嬮棿鏁版嵁鐨勫叡浜拰閫氫俊錛屼簰鏂ラ攣涓涓槑鏄劇殑緙虹偣鏄畠鍙湁涓ょ鐘舵侊細閿佸畾鍜岄潪閿佸畾銆傝屾潯浠跺彉閲忛氳繃鍏佽綰跨▼闃誨鍜岀瓑寰呭彟涓涓嚎紼嬪彂閫佷俊鍙風殑鏂規硶寮ヨˉ浜嗕簰鏂ラ攣鐨勪笉瓚籌紝瀹冨父鍜屼簰鏂ラ攣涓璧蜂嬌鐢ㄣ備嬌鐢ㄦ椂錛屾潯浠跺彉閲忚鐢ㄦ潵闃誨涓涓嚎紼嬶紝褰撴潯浠朵笉婊¤凍鏃訛紝綰跨▼寰寰瑙e紑鐩稿簲鐨勪簰鏂ラ攣騫剁瓑寰呮潯浠跺彂鐢熷彉鍖栥備竴鏃﹀叾瀹冪殑鏌愪釜綰跨▼鏀瑰彉浜嗘潯浠跺彉閲忥紝瀹冨皢閫氱煡鐩稿簲鐨勬潯浠跺彉閲忓敜閱掍竴涓垨澶氫釜姝h姝ゆ潯浠跺彉閲忛樆濉炵殑綰跨▼銆傝繖浜涚嚎紼嬪皢閲嶆柊閿佸畾浜掓枼閿佸茍閲嶆柊嫻嬭瘯鏉′歡鏄惁婊¤凍銆備竴鑸鏉ワ紝鏉′歡鍙橀噺琚敤鏉ヨ繘琛岀嚎鎵塊棿鐨勫悓姝ャ?</p> <p>    鏉′歡鍙橀噺鐨勭粨鏋勪負pthread_cond_t錛屽嚱鏁皃thread_cond_init錛堬級琚敤鏉ュ垵濮嬪寲涓涓潯浠跺彉閲忋傚畠鐨勫師鍨嬩負錛?<br />    extern int pthread_cond_init __P ((pthread_cond_t *__cond,__const pthread_condattr_t *__cond_attr)); </p> <p>    鍏朵腑cond鏄竴涓寚鍚戠粨鏋刾thread_cond_t鐨勬寚閽堬紝cond_attr鏄竴涓寚鍚戠粨鏋刾thread_condattr_t鐨勬寚閽堛傜粨鏋刾thread_condattr_t鏄潯浠跺彉閲忕殑灞炴х粨鏋勶紝鍜屼簰鏂ラ攣涓鏍鋒垜浠彲浠ョ敤瀹冩潵璁劇疆鏉′歡鍙橀噺鏄繘紼嬪唴鍙敤榪樻槸榪涚▼闂村彲鐢紝榛樿鍊兼槸PTHREAD_ PROCESS_PRIVATE錛屽嵆姝ゆ潯浠跺彉閲忚鍚屼竴榪涚▼鍐呯殑鍚勪釜綰跨▼浣跨敤銆傛敞鎰忓垵濮嬪寲鏉′歡鍙橀噺鍙湁鏈浣跨敤鏃舵墠鑳介噸鏂板垵濮嬪寲鎴栬閲婃斁銆傞噴鏀句竴涓潯浠跺彉閲忕殑鍑芥暟涓簆thread_cond_ destroy錛坧thread_cond_t cond錛夈傘 </p> <p>    鍑芥暟pthread_cond_wait錛堬級浣跨嚎紼嬮樆濉炲湪涓涓潯浠跺彉閲忎笂銆傚畠鐨勫嚱鏁板師鍨嬩負錛?<br />    extern int pthread_cond_wait __P ((pthread_cond_t *__cond, <br />    pthread_mutex_t *__mutex)); </p> <p>    綰跨▼瑙e紑mutex鎸囧悜鐨勯攣騫惰鏉′歡鍙橀噺cond闃誨銆傜嚎紼嬪彲浠ヨ鍑芥暟pthread_cond_signal鍜屽嚱鏁皃thread_cond_broadcast鍞ら啋錛屼絾鏄娉ㄦ剰鐨勬槸錛屾潯浠跺彉閲忓彧鏄搗闃誨鍜屽敜閱掔嚎紼嬬殑浣滅敤錛屽叿浣撶殑鍒ゆ柇鏉′歡榪橀渶鐢ㄦ埛緇欏嚭錛屼緥濡備竴涓彉閲忔槸鍚︿負0絳夌瓑錛岃繖涓鐐規垜浠粠鍚庨潰鐨勪緥瀛愪腑鍙互鐪嬪埌銆傜嚎紼嬭鍞ら啋鍚庯紝瀹冨皢閲嶆柊媯鏌ュ垽鏂潯浠舵槸鍚︽弧瓚籌紝濡傛灉榪樹笉婊¤凍錛屼竴鑸鏉ョ嚎紼嬪簲璇ヤ粛闃誨鍦ㄨ繖閲岋紝琚瓑寰呰涓嬩竴嬈″敜閱掋傝繖涓繃紼嬩竴鑸敤while璇彞瀹炵幇銆?</p> <p>    鍙︿竴涓敤鏉ラ樆濉炵嚎紼嬬殑鍑芥暟鏄痯thread_cond_timedwait錛堬級錛屽畠鐨勫師鍨嬩負錛?<br />    extern int pthread_cond_timedwait __P ((pthread_cond_t *__cond, <br />    pthread_mutex_t *__mutex, __const struct timespec *__abstime)); </p> <p>    瀹冩瘮鍑芥暟pthread_cond_wait錛堬級澶氫簡涓涓椂闂村弬鏁幫紝緇忓巻abstime孌墊椂闂村悗錛屽嵆浣挎潯浠跺彉閲忎笉婊¤凍錛岄樆濉炰篃琚В闄ゃ?<br />    鍑芥暟pthread_cond_signal錛堬級鐨勫師鍨嬩負錛?<br />    extern int pthread_cond_signal __P ((pthread_cond_t *__cond)); </p> <p>    瀹冪敤鏉ラ噴鏀捐闃誨鍦ㄦ潯浠跺彉閲廲ond涓婄殑涓涓嚎紼嬨傚涓嚎紼嬮樆濉炲湪姝ゆ潯浠跺彉閲忎笂鏃訛紝鍝竴涓嚎紼嬭鍞ら啋鏄敱綰跨▼鐨勮皟搴︾瓥鐣ユ墍鍐沖畾鐨勩傝娉ㄦ剰鐨勬槸錛屽繀欏葷敤淇濇姢鏉′歡鍙橀噺鐨勪簰鏂ラ攣鏉ヤ繚鎶よ繖涓嚱鏁幫紝鍚﹀垯鏉′歡婊¤凍淇″彿鍙堝彲鑳藉湪嫻嬭瘯鏉′歡鍜岃皟鐢╬thread_cond_wait鍑芥暟涔嬮棿琚彂鍑猴紝浠庤岄犳垚鏃犻檺鍒剁殑絳夊緟銆備笅闈㈡槸浣跨敤鍑芥暟pthread_cond_wait錛堬級鍜屽嚱鏁皃thread_cond_signal錛堬級鐨勪竴涓畝鍗曠殑渚嬪瓙銆?</p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>pthread_mutex_t count_lock; pthread_cond_t count_nonzero; unsigned count; decrement_count銆() { pthread_mutex_lock (&count_lock); while(count==0) pthread_cond_wait( &count_nonzero, &count_lock); count=count -1; pthread_mutex_unlock (&count_lock); } increment_count(){ pthread_mutex_lock(&count_lock); if(count==0) pthread_cond_signal(&count_nonzero); count=count+1; pthread_mutex_unlock(&count_lock); } 銆銆</div> </pre></div> <p>    count鍊間負0鏃訛紝decrement鍑芥暟鍦╬thread_cond_wait澶勮闃誨錛屽茍鎵撳紑浜掓枼閿乧ount_lock銆傛鏃訛紝褰撹皟鐢ㄥ埌鍑芥暟increment_count鏃訛紝pthread_cond_signal錛堬級鍑芥暟鏀瑰彉鏉′歡鍙橀噺錛屽憡鐭ecrement_count錛堬級鍋滄闃誨銆傝鑰呭彲浠ヨ瘯鐫璁╀袱涓嚎紼嬪垎鍒繍琛岃繖涓や釜鍑芥暟錛岀湅鐪嬩細鍑虹幇浠涔堟牱鐨勭粨鏋溿?</p> <p>    鍑芥暟pthread_cond_broadcast錛坧thread_cond_t *cond錛夌敤鏉ュ敜閱掓墍鏈夎闃誨鍦ㄦ潯浠跺彉閲廲ond涓婄殑綰跨▼銆傝繖浜涚嚎紼嬭鍞ら啋鍚庡皢鍐嶆绔炰簤鐩稿簲鐨勪簰鏂ラ攣錛屾墍浠ュ繀欏誨皬蹇冧嬌鐢ㄨ繖涓嚱鏁般?/p><br /><br /> <strong>4.4 淇″彿閲?</strong> <p><strong>    </strong>淇″彿閲忔湰璐ㄤ笂鏄竴涓潪璐熺殑鏁存暟璁℃暟鍣紝瀹冭鐢ㄦ潵鎺у埗瀵瑰叕鍏辮祫婧愮殑璁塊棶銆傚綋鍏叡璧勬簮澧炲姞鏃訛紝璋冪敤鍑芥暟sem_post錛堬級澧炲姞淇″彿閲忋傚彧鏈夊綋淇″彿閲忓煎ぇ浜庯紣鏃訛紝鎵嶈兘浣跨敤鍏叡璧勬簮錛屼嬌鐢ㄥ悗錛屽嚱鏁皊em_wait錛堬級鍑忓皯淇″彿閲忋傚嚱鏁皊em_trywait錛堬級鍜屽嚱鏁皃thread_ mutex_trylock錛堬級璧峰悓鏍風殑浣滅敤錛屽畠鏄嚱鏁皊em_wait錛堬級鐨勯潪闃誨鐗堟湰銆備笅闈㈡垜浠愪釜浠嬬粛鍜屼俊鍙烽噺鏈夊叧鐨勪竴浜涘嚱鏁幫紝瀹冧滑閮藉湪澶存枃浠?usr/include/semaphore.h涓畾涔夈?</p> <p>    淇″彿閲忕殑鏁版嵁綾誨瀷涓虹粨鏋剆em_t錛屽畠鏈川涓婃槸涓涓暱鏁村瀷鐨勬暟銆傚嚱鏁皊em_init錛堬級鐢ㄦ潵鍒濆鍖栦竴涓俊鍙烽噺銆傚畠鐨勫師鍨嬩負錛?<br />    extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value)); </p> <p>    sem涓烘寚鍚戜俊鍙烽噺緇撴瀯鐨勪竴涓寚閽堬紱pshared涓嶄負錛愭椂姝や俊鍙烽噺鍦ㄨ繘紼嬮棿鍏變韓錛屽惁鍒欏彧鑳戒負褰撳墠榪涚▼鐨勬墍<a target="_blank">鏈夌嚎</a>紼嬪叡浜紱value緇欏嚭浜嗕俊鍙烽噺鐨勫垵濮嬪箋?</p> <p>    鍑芥暟sem_post( sem_t *sem )鐢ㄦ潵澧炲姞淇″彿閲忕殑鍊箋傚綋鏈夌嚎紼嬮樆濉炲湪榪欎釜淇″彿閲忎笂鏃訛紝璋冪敤榪欎釜鍑芥暟浼氫嬌鍏朵腑鐨勪竴涓嚎紼嬩笉鍦ㄩ樆濉烇紝閫夋嫨鏈哄埗鍚屾牱鏄敱綰跨▼鐨勮皟搴︾瓥鐣ュ喅瀹氱殑銆?<br />    鍑芥暟sem_wait( sem_t *sem )琚敤鏉ラ樆濉炲綋鍓嶇嚎紼嬬洿鍒頒俊鍙烽噺sem鐨勫煎ぇ浜?錛岃В闄ら樆濉炲悗灝唖em鐨勫煎噺涓錛岃〃鏄庡叕鍏辮祫婧愮粡浣跨敤鍚庡噺灝戙傚嚱鏁皊em_trywait ( sem_t *sem )鏄嚱鏁皊em_wait錛堬級鐨勯潪闃誨鐗堟湰錛屽畠鐩存帴灝嗕俊鍙烽噺sem鐨勫煎噺涓銆?<br />    鍑芥暟sem_destroy(sem_t *sem)鐢ㄦ潵閲婃斁淇″彿閲弒em銆?</p> <p>    涓嬮潰鎴戜滑鏉ョ湅涓涓嬌鐢ㄤ俊鍙烽噺鐨勪緥瀛愩傚湪榪欎釜渚嬪瓙涓紝涓鍏辨湁4涓嚎紼嬶紝鍏朵腑涓や釜綰跨▼璐熻矗浠庢枃浠惰鍙栨暟鎹埌鍏叡鐨勭紦鍐插尯錛屽彟涓や釜綰跨▼浠庣紦鍐插尯璇誨彇鏁版嵁浣滀笉鍚岀殑澶勭悊錛堝姞鍜屼箻榪愮畻錛夈?</p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>/* File sem.c */ #include <stdio.h> #include <pthread.h> #include <semaphore.h> #define MAXSTACK 100 int stack[MAXSTACK][2]; int size=0; sem_t sem; /* 浠庢枃浠?.dat璇誨彇鏁版嵁錛屾瘡璇諱竴嬈★紝淇″彿閲忓姞涓*/ void ReadData1(void){ FILE *fp=fopen("1.dat","r"); while(!feof(fp)){ fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]); sem_post(&sem); ++size; } fclose(fp); } /*浠庢枃浠?.dat璇誨彇鏁版嵁*/ void ReadData2(void){ FILE *fp=fopen("2.dat","r"); while(!feof(fp)){ fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]); sem_post(&sem); ++size; } fclose(fp); } /*闃誨絳夊緟緙撳啿鍖烘湁鏁版嵁錛岃鍙栨暟鎹悗錛岄噴鏀劇┖闂達紝緇х畫絳夊緟*/ void HandleData1(void){ while(1){ sem_wait(&sem); printf("Plus:%d+%d=%d\n",stack[size][0],stack[size][1], stack[size][0]+stack[size][1]); --size; } } void HandleData2(void){ while(1){ sem_wait(&sem); printf("Multiply:%d*%d=%d\n",stack[size][0],stack[size][1], stack[size][0]*stack[size][1]); --size; } } int main(void){ pthread_t t1,t2,t3,t4; sem_init(&sem,0,0); pthread_create(&t1,NULL,(void *)HandleData1,NULL); pthread_create(&t2,NULL,(void *)HandleData2,NULL); pthread_create(&t3,NULL,(void *)ReadData1,NULL); pthread_create(&t4,NULL,(void *)ReadData2,NULL); /* 闃叉紼嬪簭榪囨棭閫鍑猴紝璁╁畠鍦ㄦ鏃犻檺鏈熺瓑寰?/ pthread_join(t1,NULL); } </div> </pre></div> <p>    鍦?a target="_blank">Linux</a>涓嬶紝鎴戜滑鐢ㄥ懡浠cc -lpthread sem.c -o sem鐢熸垚鍙墽琛屾枃浠秙em銆?鎴戜滑浜嬪厛緙栬緫濂芥暟鎹枃浠?.dat鍜?.dat錛屽亣璁懼畠浠殑鍐呭鍒嗗埆涓? 2 3 4 5 6 7 8 9 10鍜?-1 -2 -3 -4 -5 -6 -7 -8 -9 -10 錛屾垜浠繍琛宻em錛屽緱鍒板涓嬬殑緇撴灉錛?<br />    Multiply:-1*-2=2 <br />    Plus:-1+-2=-3 <br />    Multiply:9*10=90 <br />    Plus:-9+-10=-19 <br />    Multiply:-7*-8=56 <br />    Plus:-5+-6=-11 <br />    Multiply:-3*-4=12 <br />    Plus:9+10=19 <br />    Plus:7+8=15 <br />    Plus:5+6=11 <br /><br />    浠庝腑鎴戜滑鍙互鐪嬪嚭鍚勪釜綰跨▼闂寸殑绔炰簤鍏崇郴銆傝屾暟鍊煎茍鏈寜鎴戜滑鍘熷厛鐨勯『搴忔樉紺哄嚭鏉ヨ繖鏄敱浜巗ize榪欎釜鏁板艱鍚勪釜綰跨▼浠繪剰淇敼鐨勭紭鏁呫傝繖涔熷線寰鏄?a target="_blank">澶氱嚎紼?/a>緙栫▼瑕佹敞鎰忕殑闂銆?<br /><br />  <strong>  灝忕粨</strong>  </p> <p>    澶氱嚎紼嬬紪紼嬫槸涓涓緢鏈夋剰鎬濅篃寰堟湁鐢ㄧ殑鎶鏈紝浣跨敤澶氱嚎紼嬫妧鏈殑緗戠粶铓傝殎鏄洰鍓嶆渶甯哥敤鐨勪笅杞藉伐鍏蜂箣涓錛屼嬌鐢ㄥ綰跨▼鎶鏈殑grep姣斿崟綰跨▼鐨刧rep瑕佸揩涓婂嚑鍊嶏紝綾諱技鐨勪緥瀛愯繕鏈夊緢澶氥傚笇鏈涘ぇ瀹惰兘鐢ㄥ綰跨▼鎶鏈啓鍑洪珮鏁堝疄鐢ㄧ殑濂界▼搴忔潵銆?</p><img src ="http://m.shnenglu.com/jackdongy/aggbug/197061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/jackdongy/" target="_blank">jackdong</a> 2013-01-07 11:24 <a href="http://m.shnenglu.com/jackdongy/archive/2013/01/07/197061.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Linux涓嬬殑綆¢亾緙栫▼鎶鏈?/title><link>http://m.shnenglu.com/jackdongy/archive/2013/01/07/197055.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Mon, 07 Jan 2013 02:05:00 GMT</pubDate><guid>http://m.shnenglu.com/jackdongy/archive/2013/01/07/197055.html</guid><wfw:comment>http://m.shnenglu.com/jackdongy/comments/197055.html</wfw:comment><comments>http://m.shnenglu.com/jackdongy/archive/2013/01/07/197055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/jackdongy/comments/commentRss/197055.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/jackdongy/services/trackbacks/197055.html</trackback:ping><description><![CDATA[<p align="left"><a >http://www.pcdog.com/edu/linux/13/11/y237288.html</a><br /><br />綆¢亾鎶鏈槸<a target="_blank">Linux</a>鐨勪竴縐嶅熀鏈殑榪涚▼闂?a target="_blank">閫氫俊鎶鏈?/a>銆傚湪鏈枃涓紝鎴戜滑灝嗕負璇昏呬粙緇嶇閬撴妧鏈殑妯″瀷錛屽尶鍚嶇閬撳拰鍛藉悕綆¢亾鎶鏈殑瀹氫箟鍜屽尯鍒紝浠ュ強榪欎袱縐嶇閬撶殑鍒涘緩鏂規硶銆傚悓鏃訛紝闃愯堪濡備綍鍦ㄥ簲鐢ㄧ▼搴忓拰鍛戒護琛屼腑閫氳繃綆¢亾榪涜閫氫俊鐨勮緇嗘柟娉曘?<br /><br /><strong>    涓銆佺閬撴妧鏈ā鍨?nbsp;<br /></strong><br /><strong>    </strong>綆¢亾鎶鏈槸Linux鎿嶄綔緋葷粺涓巻鏉ュ凡涔呯殑涓縐嶈繘紼嬮棿閫氫俊鏈哄埗銆傛墍鏈夌殑綆¢亾鎶鏈紝鏃犺鏄崐鍙屽伐鐨勫尶鍚嶇閬擄紝榪樻槸鍛藉悕綆¢亾錛屽畠浠兘鏄埄鐢‵IFO鎺掗槦妯″瀷鏉ユ寚鎸ヨ繘紼嬮棿鐨勯氫俊銆傚浜庣閬擄紝鎴戜滑鍙互褰㈣薄鍦版妸瀹冧滑褰撲綔鏄繛鎺ヤ袱涓疄浣撶殑涓涓崟鍚戣繛鎺ュ櫒銆備緥濡傦紝璇風湅涓嬮潰鐨勫懡浠わ細<br />  </p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div> ls -1 | wc -l </div> </pre></div> <p align="left"><br />    璇ュ懡浠ら鍏堝垱寤轟袱涓繘紼嬶紝涓涓搴斾簬ls –1錛屽彟涓涓搴斾簬wc –l銆傜劧鍚庯紝鎶婄涓涓繘紼嬬殑鏍囧噯杈撳嚭璁句負絎簩涓繘紼嬬殑鏍囧噯杈撳叆錛堝鍥?鎵紺猴級銆傚畠鐨勪綔鐢ㄦ槸璁$畻褰撳墠鐩綍涓嬬殑鏂囦歡鏁伴噺銆?br /></p> <p align="center"><a target="_blank"><img border="0" alt="Linux涓嬬殑綆¢亾緙栫▼鎶鏈紙鍥句竴錛? src="http://www.pcdog.com/ArtImage/20071112/uv50_1.jpg" width="590" /> </a> <center><a target="_blank">鐐瑰嚮鏌ョ湅澶у浘</a></center> <p> </p> <p align="center">鍥?錛氱閬撶ず鎰忓浘 </p> <p align="left"><br /><br />    濡備笂鍥炬墍紺猴紝鍓嶉潰鐨勪緥瀛愬疄闄呬笂灝辨槸鍦ㄤ袱涓懡浠や箣闂村緩绔嬩簡涓鏍圭閬擄紙鏈夋椂鎴戜滑涔熷皢涔嬬О涓哄懡浠ょ殑嫻佹按綰挎搷浣滐級銆傜涓涓懡浠s鎵ц鍚庝駭鐢熺殑杈撳嚭浣滀負浜嗙浜屼釜鍛戒護wc鐨勮緭鍏ャ傝繖鏄竴涓崐鍙屽伐閫氫俊錛屽洜涓洪氫俊鏄崟鍚戠殑銆備袱涓懡浠や箣闂寸殑榪炴帴鐨勫叿浣撳伐浣滐紝鏄敱鍐呮牳鏉ュ畬鎴愮殑銆備笅闈㈡垜浠皢浼氱湅鍒幫紝闄や簡鍛戒護涔嬪錛屽簲鐢ㄧ▼搴忎篃鍙互浣跨敤綆¢亾榪涜榪炴帴銆?br /><br /><strong>浜屻佷俊鍙峰拰娑堟伅鐨勫尯鍒?/strong> <br /><br />    鎴戜滑鐭ラ亾錛岃繘紼嬮棿鐨勪俊鍙烽氫俊鏈哄埗鍦ㄤ紶閫掍俊鎭椂鏄互淇″彿涓鴻澆浣撶殑錛屼絾綆¢亾閫氫俊鏈哄埗鐨勪俊鎭澆浣撴槸娑堟伅銆傞偅涔堜俊鍙峰拰娑堟伅涔嬮棿鐨勫尯鍒湪鍝噷鍛紵 <br /><br /><strong>    </strong>棣栧厛錛屽湪鏁版嵁鍐呭鏂歸潰錛屼俊鍙峰彧鏄竴浜涢瀹氫箟鐨勪唬鐮侊紝鐢ㄤ簬琛ㄧず緋葷粺鍙戠敓鐨勬煇涓鐘跺喌錛涙秷鎭垯涓轟竴緇勮繛緇鍙ユ垨絎﹀彿錛屼笉榪囬噺涔熶笉浼氬お澶с傚湪浣滅敤鏂歸潰錛屼俊鍙鋒媴浠昏繘紼嬮棿灝戦噺淇℃伅鐨勪紶閫侊紝涓鑸負鍐呮牳紼嬪簭鐢ㄦ潵閫氱煡鐢ㄦ埛榪涚▼涓浜涘紓甯告儏鍐電殑鍙戠敓錛涙秷鎭垯鐢ㄤ簬榪涚▼闂翠氦鎹㈠郊姝ょ殑鏁版嵁銆?nbsp;<br /><br /><strong>    </strong>鍦ㄥ彂閫佹椂鏈烘柟闈紝淇″彿鍙互鍦ㄤ換浣曟椂鍊欏彂閫侊紱淇℃伅鍒欎笉鍙互鍦ㄤ換浣曟椂鍒誨彂閫併傚湪鍙戦佽呮柟闈紝淇″彿涓嶈兘紜畾鍙戦佽呮槸璋侊紱淇℃伅鍒欑煡閬撳彂閫佽呮槸璋併傚湪鍙戦佸璞℃柟闈紝淇″彿鏄彂緇欐煇涓繘紼嬶紱娑堟伅鍒欐槸鍙戠粰娑堟伅闃熷垪銆傚湪澶勭悊鏂瑰紡涓婏紝淇″彿鍙互涓嶄簣鐞嗕細錛涙秷鎭垯鏄繀欏誨鐞嗙殑銆傚湪鏁版嵁浼犺緭鏁堢巼鏂歸潰錛屼俊鍙蜂笉閫傚悎榪涘ぇ閲忕殑淇℃伅浼犺緭錛屽洜涓哄畠鐨勬晥鐜囦笉楂橈紱娑堟伅铏界劧涓嶉傚悎澶ч噺鐨勬暟鎹紶閫侊紝浣嗗畠鐨勬晥鐜囨瘮淇″彿寮猴紝鍥犳閫備簬涓瓑鏁伴噺鐨勬暟鎹紶閫併?nbsp;<br /><br /><strong>    涓夈佺閬撳拰鍛藉悕綆¢亾鐨勫尯鍒?/strong> <br /><br /><strong>    </strong>鎴戜滑鐭ラ亾錛屽懡鍚嶇閬撳拰綆¢亾閮藉彲浠ュ湪榪涚▼闂翠紶閫佹秷鎭紝浣嗗畠浠篃鏄湁鍖哄埆鐨勩?nbsp;<br /><br /><strong>    </strong>綆¢亾鎶鏈彧鑳界敤浜庤繛鎺ュ叿鏈夊叡鍚岀鍏堢殑榪涚▼錛屼緥濡傜埗瀛愯繘紼嬮棿鐨勯氫俊錛屽畠鏃犳硶瀹炵幇涓嶅悓鐢ㄦ埛鐨勮繘紼嬮棿鐨勪俊鎭叡浜傚啀鑰咃紝綆¢亾涓嶈兘甯歌錛屽綋璁塊棶綆¢亾鐨勮繘紼嬬粓姝㈡椂錛岀閬撲篃灝辨挙閿銆傝繖浜涢檺鍒剁粰瀹冪殑浣跨敤甯︽潵涓嶅皯闄愬埗錛屼絾鏄懡鍚嶇閬撳嵈鍏嬫湇浜嗚繖浜涢檺鍒躲?nbsp;<br /><br /><strong>    </strong>鍛藉悕綆¢亾涔熺О涓篎IFO錛屾槸涓縐嶆案涔呮х殑鏈烘瀯銆侳IFO鏂囦歡涔熷叿鏈夋枃浠跺悕銆佹枃浠墮暱搴︺佽闂鍙潈絳夊睘鎬э紝瀹冧篃鑳藉儚鍏跺畠<a target="_blank">Linux</a>鏂囦歡閭f牱琚墦寮銆佸叧闂拰鍒犻櫎錛屾墍浠ヤ換浣曡繘紼嬮兘鑳芥壘鍒板畠銆傛崲鍙ヨ瘽璇達紝鍗充嬌鏄笉鍚岀鍏堢殑榪涚▼錛屼篃鍙互鍒╃敤鍛藉悕綆¢亾榪涜閫氫俊銆?nbsp;<br /><br /><strong>    </strong>濡傛灉鎯寵鍏ㄥ弻宸ラ氫俊錛岄偅鏈濂戒嬌鐢⊿ockets API銆備笅闈㈡垜浠垎鍒粙緇嶈繖涓ょ綆¢亾錛岀劧鍚庤緇嗚鏄庣敤鏉ヨ繘琛岀閬撶紪紼嬬殑緙栫▼鎺ュ彛鍜岀郴緇熺駭鍛戒護銆?<br /><br /><strong>鍥涖佺閬撶紪紼嬫妧鏈?/strong> <br /><br /><strong>    </strong>鍦ㄧ▼搴忎腑鍒╃敤綆¢亾榪涜閫氫俊鏃訛紝鏍規嵁閫氫俊涓諱綋澶т綋鍙互鍒嗕負涓ょ鎯呭喌錛氫竴縐嶆槸鍏鋒湁鍏卞悓紲栧厛鐨勮繘紼嬮棿鐨勯氫俊錛屾瘮杈冪畝鍗曪紱鍙︿竴縐嶆槸浠繪剰榪涚▼闂撮氫俊錛岀浉瀵硅緝涓哄鏉傘備笅闈㈡垜浠厛浠庤緝涓虹畝鍗曠殑榪涚▼鍐呴氫俊寮濮嬩粙緇嶃?nbsp;<br /><br /><strong>    </strong>1. 鍏鋒湁鍏卞悓紲栧厛鐨勮繘紼嬮棿閫氫俊綆¢亾緙栫▼ <br /><br /><strong>    </strong>涓轟簡浜嗚В綆¢亾緙栫▼鎶鏈紝鎴戜滑鍏堜婦涓涓緥瀛愩傚湪榪欎釜渚嬩腑錛屾垜浠皢鍦ㄨ繘紼嬩腑鏂板緩涓涓閬擄紝鐒跺悗鍚戝畠鍐欏叆涓涓秷鎭紝綆¢亾璇誨彇娑堟伅鍚庡皢鍏跺彂鍑恒備唬鐮佸涓嬫墍紺猴細 <br /><br /><strong>    </strong>紺轟緥浠g爜1錛氱閬撶▼搴忕ず渚?nbsp;<br /></p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div><strong> 1: #include <unistd.h></strong> <strong> 2: #include <stdio.h></strong> <strong> 3: #include <string.h></strong> <strong> 4: 5: #define MAX_LINE 80 </strong> <strong> 6: #define PIPE_STDIN 0 </strong> <strong> 7: #define PIPE_STDOUT 1 </strong> <strong> 8: 9: int main() 10: ...{ 11: const char *string=...{"A sample message."}; 12: int ret, myPipe[2]; 13: char buffer[MAX_LINE+1]; 14: 15: /**//* 寤虹珛綆¢亾 */</strong> <strong> 16: ret = pipe( myPipe ); 17: 18: if (ret == 0) ...{ 19: 20: /**//* 灝嗘秷鎭啓鍏ョ閬?*/</strong> <strong>21: write( myPipe[PIPE_STDOUT], string, strlen(string) ); 22: 23: /**//* 浠庣閬撹鍙栨秷鎭?*/</strong> <strong>24: ret = read( myPipe[PIPE_STDIN], buffer, MAX_LINE ); 25: 26: /**//* 鍒╃敤Null緇撴潫瀛楃涓?*/</strong> <strong>27: buffer[ ret ] = 0; 28: 29: printf("%s\n", buffer); 30: 31: }</strong> <strong>32: 33: return 0; 34: }</strong> <strong></strong></div> </pre></div> <p align="left"></p> <p><strong>    <br /></strong>    涓婇潰鐨勭ず渚嬩唬鐮佷腑錛屾垜浠埄鐢╬ipe璋冪敤鏂板緩浜嗕竴涓閬擄紝鍙傝絎?6琛屼唬鐮併?鎴戜滑榪樺緩绔嬩簡涓涓敱涓や釜鍏冪礌緇勬垚鐨勬暟緇勶紝鐢ㄦ潵鎻忚堪鎴戜滑鐨勭閬撱傛垜浠殑綆¢亾琚畾涔変負涓や釜鍗曠嫭鐨勬枃浠舵弿榪扮錛屼竴涓敤鏉ヨ緭鍏ワ紝涓涓敤鏉ヨ緭鍑恒傛垜浠兘浠庣閬撶殑涓绔緭鍏ワ紝鐒跺悗浠庡彟涓绔鍑恒傚鏋滆皟鐢ㄦ垚鍔燂紝pipe鍑芥暟榪斿洖鍊間負0銆傝繑鍥炲悗錛屾暟緇刴yPipe涓瓨鏀劇殑鏄袱涓柊鐨勬枃浠舵弿榪扮錛屽叾涓厓绱爉yPipe[1]鍖呭惈鐨勬枃浠舵弿榪扮鐢ㄤ簬綆¢亾鐨勮緭鍏ワ紝鍏冪礌myPipe[0] 鍖呭惈鐨勬枃浠舵弿榪扮鐢ㄤ簬綆¢亾鐨勮緭鍑恒?<br /><br />    鍦ㄧ21琛屼唬鐮侊紝鎴戜滑鍒╃敤write鍑芥暟鎶婃秷鎭啓鍏ョ閬撱傜珯鍦ㄥ簲鐢ㄧ▼搴忕殑瑙掑害錛屽畠鏄湪鍚憇tdout杈撳嚭銆傜幇鍦紝璇ョ閬撳瓨鏈夋垜浠殑娑堟伅錛屾垜浠彲浠ュ埄鐢ㄧ24琛岀殑read鍑芥暟鏉ヨ瀹冦傚浜庡簲鐢ㄧ▼搴忔潵璇達紝鎴戜滑鏄埄鐢╯tdin鎻忚堪絎︿粠綆¢亾璇誨彇娑堟伅鐨勩俽ead鍑芥暟鎶婁粠綆¢亾璇誨彇鐨勬暟鎹瓨鏀懼埌buffer鍙橀噺涓傜劧鍚庡湪buffer鍙橀噺鐨勬湯灝炬坊鍔犱竴涓狽ULL錛岃繖鏍峰氨鑳藉埄鐢╬rintf鍑芥暟姝g‘鐨勮緭鍑哄畠浜嗐傚湪鏈緥涓殑綆¢亾鍙互鍒╃敤涓嬪浘瑙i噴錛?<br /></p> <p align="center"><a target="_blank"><img border="0" alt="Linux涓嬬殑綆¢亾緙栫▼鎶鏈紙鍥句簩錛? src="http://www.pcdog.com/ArtImage/20071112/uv50_2.jpg" width="590" /> </a> <center><a target="_blank">鐐瑰嚮鏌ョ湅澶у浘</a></center> <p> </p> <p align="center">鍥?錛氱ず渚嬩唬鐮?涓崐鍙屽伐綆¢亾鐨勭ず鎰忓浘 </p> <p>    榪欎釜渚嬪瓙涓紝閫氫俊鏄湪鍏鋒湁鍏卞悓紲栧厛鐨勮繘紼嬮棿鍙戠敓鐨勶紝鍗崇埗榪涚▼鍜屽瓙榪涚▼閫氫俊銆傝繖鏍峰仛灞闄愭уお澶э紝浣嗘垜浠彧鏄敤瀹冩潵緇欒鑰呬竴涓劅鎬х殑璁よ瘑銆傛帴涓嬫潵錛屾垜浠皢浠嬬粛鏇翠負楂樼駭鐨勮繘紼嬮棿鐨勭閬撻氫俊銆?/p> <p align="left"><strong> 2.榪涚▼闂撮氫俊綆¢亾緙栫▼</strong> <br /><br /><strong>    </strong>鍦ㄥ埄鐢ㄧ閬撴妧鏈繘琛岀紪紼嬫椂錛屽鐞嗚鐢ㄥ埌涓婇潰浠嬬粛鐨刾ipe鍑芥暟澶栵紝榪樼敤鍒板彟澶栦笁涓嚱鏁幫紝濡備笅鎵紺恒?<br /><br />飦?pipe鍑芥暟錛氳鍑芥暟鐢ㄤ簬鍒涘緩涓涓柊鐨勫尶鍚嶇閬撱?<br /><br />飦?dup鍑芥暟錛氳鍑芥暟鐢ㄤ簬鎷瘋礉鏂囦歡鎻忚堪絎︺?<br /><br />飦?mkfifo鍑芥暟錛氳鍑芥暟鐢ㄤ簬鍒涘緩涓涓懡鍚嶇閬擄紙fifo錛夈?nbsp;<br /><br /><strong>    </strong>褰撶劧錛屽湪綆¢亾閫氫俊榪囩▼涓繕鐢ㄥ埌鍏跺畠鍑芥暟錛屽埌鏃舵垜浠細鍔犱互浠嬬粛銆傞渶瑕佹敞鎰忕殑鏄紝璇村埌搴曪紝綆¢亾鏃犻潪灝辨槸涓瀵規枃浠舵弿榪扮錛屽洜姝や換浣曡兘澶熸搷浣滄枃浠舵搷浣滅鐨勫嚱鏁伴兘鍙互浣跨敤綆¢亾銆傝繖鍖呮嫭浣嗕笉闄愪簬榪欎簺鍑芥暟錛歴elect銆乺ead銆亀rite銆?fcntl銆乫reopen錛岀瓑絳夈?nbsp;<br /><br /><strong>    2.1鍑芥暟pipe</strong> <br /><br /><strong>    </strong>鍑芥暟pipe鐢ㄦ潵寤虹珛涓涓柊鐨勭閬擄紝璇ョ閬撶敤涓や釜鏂囦歡鎻忚堪絎﹁繘琛屾弿榪般傚嚱鏁皃ipe鐨勫師鍨嬪涓嬫墍紺猴細<br /></p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>#include <unistd.h> int pipe( int fds[2] ); </div> </pre></div> <p align="left"></p> <p><strong>    </strong>褰撹皟鐢ㄦ垚鍔熸椂錛屽嚱鏁皃ipe榪斿洖鍊間負0錛屽惁鍒欒繑鍥炲間負-1銆傛垚鍔熻繑鍥炴椂錛屾暟緇刦ds琚~鍏ヤ袱涓湁鏁堢殑鏂囦歡鎻忚堪絎︺傛暟緇勭殑絎竴涓厓绱犱腑鐨勬枃浠舵弿榪扮渚涘簲鐢ㄧ▼搴忚鍙栦箣鐢紝鏁扮粍鐨勭浜屼釜鍏冪礌涓殑鏂囦歡鎻忚堪絎﹀彲浠ョ敤鏉ヤ緵搴旂敤紼嬪簭鍐欏叆銆?nbsp;<br /><br /><strong>    </strong>涓嬮潰鎴戜滑鑰冨療鍦ㄤ竴涓寘鍚涓繘紼嬬殑搴旂敤紼嬪簭涓殑綆¢亾紺轟緥銆傚湪璇ョ▼搴忎腑錛堣紺轟緥浠g爜2錛夛紝絎?4琛岀敤浜庡垱寤轟竴涓閬擄紝鐒跺悗榪涚▼鍦ㄧ16琛屽垎鍙夛紝鍙樻垚涓涓埗榪涚▼鍜屼竴涓瓙榪涚▼銆傚湪瀛愯繘紼嬩腑錛屾垜浠皾璇曚粠錛堝湪絎?8琛屽緩绔嬬殑錛夌閬撶殑杈撳叆鎻忚堪絎﹁鍙栵紝榪欐椂璇ヨ繘紼嬪皢琚寕璧鳳紝鐩村埌綆¢亾涓湁鍙互璇誨彇鐨勫唴瀹逛負姝€?nbsp;<br /><br /><strong>    </strong>璇誨畬鍚庯紝鎴戜滑鐢∟ULL浣滀負璇誨彇鐨勫唴瀹圭殑緇撴潫絎︼紝榪欐牱鐨勮瘽錛岃鐨勮繖浜涘唴瀹瑰氨鑳戒嬌鐢╬rintf鍑芥暟姝g‘鎵撳嵃杈撳嚭浜嗐傜埗榪涚▼鍏堟槸鍒╃敤瀛樻斁鍦╰hePipe[1]涓殑“鍐欐枃浠舵爣璇嗙”鍚戠閬撳啓鍏ユ祴璇曞瓧絎︿覆錛岀劧鍚庡氨浣跨敤wait鍑芥暟鏉ョ瓑寰呭瓙榪涚▼閫鍑恒?nbsp;<br /><br /><strong>    </strong>鍦ㄦ垜浠殑榪欎釜紼嬪簭涓渶瑕佸姞浠ユ敞鎰忕殑鏄紝鎴戜滑鐨勫瓙榪涚▼鏄浣曠戶鎵跨埗榪涚▼鍒╃敤pipe鍑芥暟寤虹珛鐨勬枃浠舵弿榪扮鐨勶紝浠ュ強濡備綍鍒╃敤璇ユ枃浠舵弿榪扮榪涜閫氫俊鐨勩傚嚱鏁癴ork涓鏃︽墽琛岋紝瀛愯繘紼嬩細緇ф壙鐖惰繘紼嬬殑鍔熻兘鍜岀閬撶殑鏂囦歡鎻忚堪絎︼紝浣嗗浜庡唴鏍告潵璇達紝鐖惰繘紼嬪拰瀛愯繘紼嬫槸騫崇瓑鐨勶紝瀹冧滑鏄嫭绔嬭繍琛岀殑銆備篃灝辨槸璇達紝涓や釜榪涚▼鍒嗗埆鍏鋒湁鍗曠嫭鐨勫唴瀛樼┖闂達紝瀹冧滑姝f槸閫氳繃pipe鍑芥暟鏉ヤ簰閫氭湁鏃犵殑銆?br /></p> <p align="left"></p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>紺轟緥浠g爜2錛氭紨紺轟袱涓繘紼嬮棿鐨勭閬撴ā鍨嬬殑浠g爜 1: #include <stdio.h> 2: #include <unistd.h> 3: #include <string.h> 4: #include <wait.h> 5: 6: #define MAX_LINE 80 7: 8: int main() 9: ...{ 10: int thePipe[2], ret; 11: char buf[MAX_LINE+1]; 12: const char *testbuf=...{"a test string."}; 13: 14: if ( pipe( thePipe ) == 0 ) ...{ 15: 16: if (fork() == 0) ...{ 17: 18: ret = read( thePipe[0], buf, MAX_LINE ); 19: buf[ret] = 0; 20: printf( "Child read %s\n", buf ); 21: 22: } else ...{ 23: 24: ret = write( thePipe[1], testbuf, strlen(testbuf) ); 25: ret = wait( NULL ); 26: 27: } 28: 29: } 30: 31: return 0; 32: } </div> </pre></div> <p align="left"></p> <p><br /><br />    闇瑕佹敞鎰忕殑鏄紝鍦ㄨ繖涓ず渚嬬▼搴忎腑鎴戜滑娌℃湁璇存槑濡備綍鍏抽棴綆¢亾錛屽洜涓轟竴鏃﹁繘紼嬬粨鏉燂紝涓庣閬撴湁鍏崇殑璧勬簮灝嗚鑷姩閲婃斁銆傚敖綆″姝わ紝涓轟簡鍏繪垚涓縐嶈壇濂界殑緙栫▼涔犳儻錛屾渶濂藉埄鐢╟lose璋冪敤鏉ュ叧闂閬撶殑鎻忚堪絎︼紝濡備笅鎵紺猴細 <br /></p> <p align="left"></p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div> ret = pipe( myPipe ); ... close( myPipe[0] ); close( myPipe[1] ); </div> </pre></div> <p align="left"><br />    濡傛灉綆¢亾鐨勫啓鍏ョ鍏抽棴錛屼絾鏄繕鏈夎繘紼嬪皾璇曚粠綆¢亾璇誨彇鐨勮瘽錛屽皢琚繑鍥?錛岀敤鏉ユ寚鍑虹閬撳凡涓嶅彲鐢紝騫朵笖搴斿綋鍏抽棴瀹冦傚鏋滅閬撶殑璇誨嚭绔叧闂紝浣嗘槸榪樻湁榪涚▼灝濊瘯鍚戠閬撳啓鍏ョ殑璇濓紝璇曞浘鍐欏叆鐨勮繘紼嬪皢鏀跺埌涓涓猄IGPIPE淇″彿錛岃嚦浜庝俊鍙風殑鍏蜂綋澶勭悊鍒欒瑙嗗叾淇″彿澶勭悊紼嬪簭鑰屽畾浜嗐?br /><br /><strong>2.2 dup鍑芥暟鍜宒up2鍑芥暟 <br /><br /></strong>    dup鍜宒up2涔熸槸涓や釜闈炲父鏈夌敤鐨勮皟鐢紝瀹冧滑鐨勪綔鐢ㄩ兘鏄敤鏉ュ鍒朵竴涓枃浠剁殑鎻忚堪絎︺傚畠浠粡甯哥敤鏉ラ噸瀹氬悜榪涚▼鐨剆tdin銆乻tdout鍜宻tderr銆傝繖涓や釜鍑芥暟鐨勫師鍨嬪涓嬫墍紺猴細 <br /></p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>#include <unistd.h> int dup( int oldfd ); int dup2( int oldfd, int targetfd ) </div> </pre></div> <p align="left">    鍒╃敤鍑芥暟dup錛屾垜浠彲浠ュ鍒朵竴涓弿榪扮銆備紶緇欒鍑芥暟涓涓棦鏈夌殑鎻忚堪絎︼紝瀹冨氨浼氳繑鍥炰竴涓柊鐨勬弿榪扮錛岃繖涓柊鐨勬弿榪扮鏄紶緇欏畠鐨勬弿榪扮鐨勬嫹璐濄傝繖鎰忓懗鐫錛岃繖涓や釜鎻忚堪絎﹀叡浜悓涓涓?a target="_blank">鏁版嵁緇撴瀯</a>銆備緥濡傦紝濡傛灉鎴戜滑瀵逛竴涓枃浠舵弿榪扮鎵цlseek鎿嶄綔錛屽緱鍒扮殑絎竴涓枃浠剁殑浣嶇疆鍜岀浜屼釜鏄竴鏍風殑銆備笅闈㈡槸鐢ㄦ潵璇存槑dup鍑芥暟浣跨敤鏂規硶鐨勪唬鐮佺墖孌碉細<br /></p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div> int fd1, fd2; ... fd2 = dup( fd1 ); </div> </pre></div> <p align="left">    闇瑕佹敞鎰忕殑鏄紝鎴戜滑鍙互鍦ㄨ皟鐢╢ork涔嬪墠寤虹珛涓涓弿榪扮錛岃繖涓庤皟鐢╠up寤虹珛鎻忚堪絎︾殑鏁堟灉鏄竴鏍風殑錛屽瓙榪涚▼涔熷悓鏍蜂細鏀跺埌涓涓鍒跺嚭鏉ョ殑鎻忚堪絎︺?<br /><br />    dup2鍑芥暟璺焏up鍑芥暟鐩鎬技錛屼絾dup2鍑芥暟鍏佽璋冪敤鑰呰瀹氫竴涓湁鏁堟弿榪扮鍜岀洰鏍囨弿榪扮鐨刬d銆俤up2鍑芥暟鎴愬姛榪斿洖鏃訛紝鐩爣鎻忚堪絎︼紙dup2鍑芥暟鐨勭浜屼釜鍙傛暟錛夊皢鍙樻垚婧愭弿榪扮錛坉up2鍑芥暟鐨勭涓涓弬鏁幫級鐨勫鍒跺搧錛屾崲鍙ヨ瘽璇達紝涓や釜鏂囦歡鎻忚堪絎︾幇鍦ㄩ兘鎸囧悜鍚屼竴涓枃浠訛紝騫朵笖鏄嚱鏁扮涓涓弬鏁版寚鍚戠殑鏂囦歡銆備笅闈㈡垜浠敤涓孌典唬鐮佸姞浠ヨ鏄庯細 </p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div> int oldfd; oldfd = open("app_log", (O_RDWR | O_CREATE), 0644 ); dup2( oldfd, 1 ); close( oldfd ); </div> </pre></div> <p align="left">    鏈緥涓紝鎴戜滑鎵撳紑浜嗕竴涓柊鏂囦歡錛岀О涓?#8220;app_log”錛屽茍鏀跺埌涓涓枃浠舵弿榪扮錛岃鎻忚堪絎﹀彨鍋歠d1銆傛垜浠皟鐢╠up2鍑芥暟錛屽弬鏁頒負oldfd鍜?錛岃繖浼氬鑷寸敤鎴戜滑鏂版墦寮鐨勬枃浠舵弿榪扮鏇挎崲鎺夌敱1浠h〃鐨勬枃浠舵弿榪扮錛堝嵆stdout錛屽洜涓烘爣鍑嗚緭鍑烘枃浠剁殑id涓?錛夈備換浣曞啓鍒皊tdout鐨勪笢瑗匡紝鐜板湪閮藉皢鏀逛負鍐欏叆鍚嶄負“app_log”鐨勬枃浠朵腑銆傞渶瑕佹敞鎰忕殑鏄紝dup2鍑芥暟鍦ㄥ鍒朵簡oldfd涔嬪悗錛屼細绔嬪嵆灝嗗叾鍏抽棴錛屼絾涓嶄細鍏蟲帀鏂拌繎鎵撳紑鐨勬枃浠舵弿榪扮錛屽洜涓烘枃浠舵弿榪扮1鐜板湪涔熸寚鍚戝畠銆?nbsp;<br /><br />    涓嬮潰鎴戜滑浠嬬粛涓涓洿鍔犳繁鍏ョ殑紺轟緥浠g爜銆傚洖蹇嗕竴涓嬫湰鏂囧墠闈㈣鐨勫懡浠よ綆¢亾錛屽湪閭i噷錛屾垜浠皢ls –1鍛戒護鐨勬爣鍑嗚緭鍑轟綔涓烘爣鍑嗚緭鍏ヨ繛鎺ュ埌wc –l鍛戒護銆傛帴涓嬫潵錛屾垜浠氨鐢ㄤ竴涓狢紼嬪簭鏉ュ姞浠ヨ鏄庤繖涓繃紼嬬殑瀹炵幇銆備唬鐮佸涓嬮潰鐨勭ず渚嬩唬鐮?鎵紺恒?nbsp;<br /><br />    鍦ㄧず渚嬩唬鐮?涓紝棣栧厛鍦ㄧ9琛屼唬鐮佷腑寤虹珛涓涓閬擄紝鐒跺悗灝嗗簲鐢ㄧ▼搴忓垎鎴愪袱涓繘紼嬶細涓涓瓙榪涚▼錛堢13–16琛岋級鍜屼竴涓埗榪涚▼錛堢20–23琛岋級銆傛帴涓嬫潵錛屽湪瀛愯繘紼嬩腑棣栧厛鍏抽棴stdout鎻忚堪絎︼紙絎?3琛岋級錛岀劧鍚庢彁渚涗簡ls –1鍛戒護鍔熻兘錛屼笉榪囧畠涓嶆槸鍐欏埌stdout錛堢13琛岋級錛岃屾槸鍐欏埌鎴戜滑寤虹珛鐨勭閬撶殑杈撳叆绔紝榪欐槸閫氳繃dup鍑芥暟鏉ュ畬鎴愰噸瀹氬悜鐨勩傚湪絎?4琛岋紝浣跨敤dup2鍑芥暟鎶妔tdout閲嶅畾鍚戝埌綆¢亾錛坧fds[1]錛夈備箣鍚庯紝椹笂鍏蟲帀綆¢亾鐨勮緭鍏ョ銆傜劧鍚庯紝浣跨敤execlp鍑芥暟鎶婂瓙榪涚▼鐨勬槧鍍忔浛鎹負鍛戒護ls –1鐨勮繘紼嬫槧鍍忥紝涓鏃﹁鍛戒護鎵ц錛屽畠鐨勪換浣曡緭鍑洪兘灝嗗彂緇欑閬撶殑杈撳叆绔?nbsp;<br /><br />    鐜板湪鏉ョ爺絀朵竴涓嬬閬撶殑鎺ユ敹绔備粠浠g爜涓彲浠ョ湅鍑猴紝綆¢亾鐨勬帴鏀剁鏄敱鐖惰繘紼嬫潵鎷呭綋鐨勩傞鍏堝叧闂璼tdin鎻忚堪絎︼紙絎?0琛岋級錛屽洜涓烘垜浠笉浼氫粠鏈哄櫒鐨勯敭鐩樼瓑鏍囧噯璁懼鏂囦歡鏉ユ帴鏀舵暟鎹殑杈撳叆錛岃屾槸浠庡叾瀹冪▼搴忕殑杈撳嚭涓帴鏀舵暟鎹傜劧鍚庯紝鍐嶄竴嬈$敤鍒癲up2鍑芥暟錛堢21琛岋級錛岃stdin鍙樻垚綆¢亾鐨勮緭鍑虹錛岃繖鏄氳繃璁╂枃浠舵弿榪扮0錛堝嵆甯歌鐨剆tdin錛夌瓑浜巔fds[0]鏉ュ疄鐜扮殑銆傚叧闂閬撶殑stdout绔紙pfds[1]錛夛紝鍥犱負鍦ㄨ繖閲岀敤涓嶅埌瀹冦傛渶鍚庯紝浣跨敤execlp鍑芥暟鎶婄埗榪涚▼鐨勬槧鍍忔浛鎹負鍛戒護wc -1鐨勮繘紼嬫槧鍍忥紝鍛戒護wc -1鎶婄閬撶殑鍐呭浣滀負瀹冪殑杈撳叆錛堢23琛岋級銆?br /></p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>紺轟緥浠g爜3錛氬埄鐢–瀹炵幇鍛戒護鐨勬祦姘寸嚎鎿嶄綔鐨勪唬鐮? 1: #include <stdio.h> 2: #include <stdlib.h> 3: #include <unistd.h> 4: 5: int main() 6: ...{ 7: int pfds[2]; 8: 9: if ( pipe(pfds) == 0 ) ...{ 10: 11: if ( fork() == 0 ) ...{ 12: 13: close(1); 14: dup2( pfds[1], 1 ); 15: close( pfds[0] ); 16: execlp( "ls", "ls", "-1", NULL ); 17: 18: } else ...{ 19: 20: close(0); 21: dup2( pfds[0], 0 ); 22: close( pfds[1] ); 23: execlp( "wc", "wc", "-l", NULL ); 24: 25: } 26: 27: } 28: 29: return 0; 30: } </div> </pre></div> <p align="left"><br />     鍦ㄨ紼嬪簭涓紝闇瑕佹牸澶栧叧娉ㄧ殑鏄紝鎴戜滑鐨勫瓙榪涚▼鎶婂畠鐨勮緭鍑洪噸瀹氬悜鐨勭閬撶殑杈撳叆錛岀劧鍚庯紝鐖惰繘紼嬪皢瀹冪殑杈撳叆閲嶅畾鍚戝埌綆¢亾鐨勮緭鍑恒傝繖鍦ㄥ疄闄呯殑搴旂敤紼嬪簭寮鍙戜腑鏄潪甯告湁鐢ㄧ殑涓縐嶆妧鏈?br /><br /><strong>  2.3 mkfifo鍑芥暟 <br /><br /></strong>    mkfifo鍑芥暟鐨勪綔鐢ㄦ槸鍦ㄦ枃浠剁郴緇熶腑鍒涘緩涓涓枃浠訛紝璇ユ枃浠剁敤浜庢彁渚汧IFO鍔熻兘錛屽嵆鍛藉悕綆¢亾銆傚墠杈硅鐨勯偅浜涚閬撻兘娌℃湁鍚嶅瓧錛屽洜姝ゅ畠浠縐頒負鍖垮悕綆¢亾錛屾垨綆縐扮閬撱傚鏂囦歡緋葷粺鏉ヨ錛屽尶鍚嶇閬撴槸涓嶅彲瑙佺殑錛屽畠鐨勪綔鐢ㄤ粎闄愪簬鍦ㄧ埗榪涚▼鍜屽瓙榪涚▼涓や釜榪涚▼闂磋繘琛岄氫俊銆傝屽懡鍚嶇閬撴槸涓涓彲瑙佺殑鏂囦歡錛屽洜姝わ紝瀹冨彲浠ョ敤浜庝換浣曚袱涓繘紼嬩箣闂寸殑閫氫俊錛屼笉綆¤繖涓や釜榪涚▼鏄笉鏄埗瀛愯繘紼嬶紝涔熶笉綆¤繖涓や釜榪涚▼涔嬮棿鏈夋病鏈夊叧緋匯侻kfifo鍑芥暟鐨勫師鍨嬪涓嬫墍紺猴細 </p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div> #include <sys/types.h> #include <sys/stat.h> int mkfifo( const char *pathname, mode_t mode ); </div> </pre></div> <p align="left"></p> <p>     mkfifo鍑芥暟闇瑕佷袱涓弬鏁幫紝絎竴涓弬鏁幫紙pathname錛夋槸灝嗚鍦ㄦ枃浠剁郴緇熶腑鍒涘緩鐨勪竴涓笓鐢ㄦ枃浠躲傜浜屼釜鍙傛暟錛坢ode錛夌敤鏉ヨ瀹欶IFO鐨勮鍐欐潈闄愩侻kfifo鍑芥暟濡傛灉璋冪敤鎴愬姛鐨勮瘽錛岃繑鍥炲間負0錛涘鏋滆皟鐢ㄥけ璐ヨ繑鍥炲間負-1銆備笅闈㈡垜浠互涓涓疄渚嬫潵璇存槑濡備綍浣跨敤mkfifo鍑芥暟寤轟竴涓猣ifo錛屽叿浣撲唬鐮佸涓嬫墍紺猴細</p> <p align="left"></p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div> int ret; ... ret = mkfifo( "/tmp/cmd_pipe", S_IFIFO | 0666 ); if (ret == 0) ...{ // 鎴愬姛寤虹珛鍛藉悕綆¢亾 } else ...{ // 鍒涘緩鍛藉悕綆¢亾澶辮觸 } </div> </pre></div> <p align="left"></p> <p>    鍦ㄨ繖涓緥瀛愪腑錛屽埄鐢?tmp鐩綍涓殑cmd_pipe鏂囦歡寤虹珛浜嗕竴涓懡鍚嶇閬擄紙鍗砯ifo錛夈備箣鍚庯紝灝卞彲浠ユ墦寮榪欎釜鏂囦歡榪涜璇誨啓鎿嶄綔錛屽茍浠ユ榪涜閫氫俊浜嗐傚懡鍚嶇閬撲竴鏃︽墦寮錛屽氨鍙互鍒╃敤鍏稿瀷鐨勮緭鍏ヨ緭鍑哄嚱鏁頒粠涓鍙栧唴瀹廣備婦渚嬫潵璇達紝涓嬮潰鐨勪唬鐮佹鍚戞垜浠睍紺轟簡濡備綍閫氳繃fgets鍑芥暟鏉ヤ粠綆¢亾涓鍙栧唴瀹癸細</p> <p align="left"></p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div> pfp = fopen( "/tmp/cmd_pipe", "r" ); ... ret = fgets( buffer, MAX_LINE, pfp ); </div> </pre></div> <p align="left"></p> <p>    鎴戜滑榪樿兘鍚戠閬撲腑鍐欏叆鍐呭錛屼笅闈㈢殑浠g爜孌靛悜鎴戜滑灞曠ず浜嗗埄鐢╢printf鍑芥暟鍚戠閬撳啓鍏ョ殑鍏蜂綋鏂規硶錛?/p> <p align="left"></p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div> pfp = fopen( "/tmp/cmd_pipe", "w+ ); ... ret = fprintf( pfp, "Here’s a test string!\n" ); </div> </pre></div> <p align="left"></p> <p><br />    瀵瑰懡鍚嶇閬撴潵璇達紝闄ら潪鍐欏叆鏂逛富鍔ㄦ墦寮綆¢亾鐨勮鍙栫錛屽惁鍒欒鍙栨柟鏄棤娉曟墦寮鍛藉悕綆¢亾鐨勩侽pen璋冪敤鎵ц鍚庯紝璇誨彇鏂瑰皢琚攣浣忥紝鐩村埌鍐欏叆鏂瑰嚭鐜頒負姝€傚敖綆″懡鍚嶇閬撴湁榪欐牱鐨勫眬闄愭э紝浣嗗畠浠嶄笉澶變負涓縐嶆湁鏁堢殑榪涚▼闂撮氫俊宸ュ叿銆?<br /><br />    涓婇潰浠嬬粛鐨勬槸涓庣閬撴湁鍏崇殑涓浜涚郴緇熻皟鐢紝涓嬮潰浠嬬粛綆¢亾鍛戒護鐩稿叧鐨勭郴緇熷懡浠ゃ?br /><strong>浜斻佷笌綆¢亾鐩稿叧鐨勭郴緇熷懡浠?/strong> <br /><br />    鐜板湪寮濮嬶紝鎴戜滑鏉ョ爺絀朵笌榪涚▼闂撮氫俊瀵嗗垏鐩稿叧鐨勪竴浜涚郴緇熷懡浠ゃ傞鍏堜粙緇嶇殑鏄痬kfifo鍛戒護錛屽畠鐨勫姛鑳戒笌mkfifo緋葷粺璋冪敤鐩鎬技錛屽彧涓嶈繃瀹冩槸鐢ㄦ潵鍦ㄥ懡浠よ涓緩绔嬩竴涓懡鍚嶇閬撱?<br /><br />    鍦ㄥ懡浠よ涓嬪緩绔媐ifo鐨勪笓鐢ㄦ枃浠訛紝鍗沖懡鍚嶇閬撶殑甯哥敤鏂規硶鏈変袱涓紝mkfifo鍛戒護渚挎槸鍏朵腑涔嬩竴銆俶kfifo鍛戒護鐨勪竴鑸敤娉曞涓嬫墍紺猴細 </p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>mkfifo [options] name</div> </pre></div> <p> </p> <p>    榪欓噷鐨刼ptions涓鑸負-m錛屽嵆妯″紡錛岀敤浠ユ寚鍑鴻鍐欐潈闄愶紱name鏄鍒涘緩鐨勭閬撶殑鍚嶇О錛屽繀瑕佹椂鍙互鍔犱笂璺緞銆傚鏋滄垜浠病鏈夎瀹氭潈闄愶紝璇ュ懡浠や細閲囧彇榛樿鍊?644銆傝繖閲屼互涓涓叿浣撳疄渚嬫潵璇存槑濡備綍鍦?tmp鐩綍涓嬮潰寤虹珛涓涓О涓篶md_pipe鐨勫懡鍚嶇閬擄細<br /></p> <p> </p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>$ mkfifo /tmp/cmd_pipe</div> </pre></div> <p> </p> <p>    涓嬮潰鐢ㄤ緥瀛愯鏄庡浣曠粰鍛藉悕綆¢亾鎸囧畾璇誨啓鏉冮檺銆傝繖閲屾垜浠厛灝嗗墠闈㈠緩绔嬬殑綆¢亾鍒犳帀錛岀劧鍚庨噸鏂板緩绔嬬閬擄紝騫舵寚瀹氱閬撶殑鏉冮檺涓?644錛屽綋鐒舵偍涔熷彲浠ユ寚瀹氬叾浠栨潈闄愶細</p> <p> </p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div> $ rm cmd_pipe $ mkfifo -m 0644 /tmp/cmd_pipe </div> </pre></div> <p> </p> <p>    涓婇潰鐨勬潈闄愪竴緇忓緩绔嬶紝灝辮兘澶熷湪鍛戒護琛岃涓嬮氳繃姝ょ閬撹繘琛岄氫俊浜嗐傛瘮濡傦紝鍙互鍦ㄤ竴涓粓绔笂錛屽埄鐢╟at鍛戒護鏉ヨ鍙栫閬擄細</p> <p> </p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>$ cat cmd_pipe</div> </pre></div> <p> </p> <p>    褰撹緭鍏ヨ鍛戒護鍚庯紝鎴戜滑鐨勮繘紼嬪氨浼氳鎸傝搗錛岀瓑寰呭啓鍏ョ▼搴忔墦寮姝ょ閬撱傜幇鍦紝鍦ㄥ彟涓涓粓绔笂鍒╃敤echo鍛戒護鍚戣繖涓懡鍚嶇閬撳啓鍏ワ細<br /></p> <p> </p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div> $ echo Hi > cmd_pipe</div> </pre></div> <p> </p> <p>    榪欎釜鍛戒護緇撴潫鍚庯紝瑕佽鍙栬綆¢亾鐨勭▼搴忥紙鍗砪at錛夊皢琚敜閱掞紝鐒跺悗緇撴潫銆備負閱掔洰璧瘋錛岃繖閲屽垪鍑哄畬鏁寸殑璇誨彇鏂癸紙涔熷氨鏄鍙栫閬撶殑紼嬪簭錛夎緭鍏ョ殑鍛戒護鍜屽緱鍒扮殑緇撴灉錛?/p> <p> </p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div>$ cat cmd_pipe Hi $ </div> </pre></div> <p> </p> <p>    鐢辨鐪嬫潵錛屽懡鍚嶇閬撲笉浠呭湪C紼嬪簭涓潪甯告湁鐢紝鑰屼笖鍦ㄨ剼鏈腑浣滅敤涔熷緢澶с傚綋鐒訛紝濡傛灉緇勫悎浣跨敤錛屾晥鏋滀篃鏄緢濂界殑銆?br /><br />    闄や簡mkfifo鍛戒護澶栵紝mknod鍛戒護涔熷彲浠ョ敤鏉ュ垱寤哄懡鍚嶇閬擄紝鍏剁敤娉曞涓嬫墍紺猴細</p> <p> </p> <div style="overflow: auto; width: 500px"><pre style="border-top: black 1px solid; border-right: black 1px solid; border-bottom: black 1px solid; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: black 1px solid; padding-right: 4px; background-color: rgb(237,237,237)"><div> $ mknod cmd_pipe p</div> </pre></div> <p> </p> <p><br />    璇ュ懡浠ゆ墽琛屽悗錛屽皢鍦ㄥ綋鍓嶇洰褰曚笅鍒涘緩涓涓懡鍚嶇閬揷md_pipe錛宲鐢ㄤ簬鎸囧嚭寤虹珛鐨勬槸鍛藉悕綆¢亾銆?<br /><br /><strong>    鍏佸皬緇?/strong> <br /><br />    鍦ㄨ繖綃囨枃绔犱腑錛屾垜浠粙緇嶄簡綆¢亾鍜屽懡鍚嶇閬撶殑姒傚康錛岃緇嗙殑璇存槑浜嗗簲鐢ㄧ▼搴忓拰鍛戒護琛屽垱寤虹閬撶殑鏂規硶錛屼互鍙婇氳繃瀹冧滑榪涜閫氫俊鐨処/O鏈哄埗銆傜劧鍚庯紝璁ㄨ浜嗗浣曞埄鐢╠up鍜?dup2鍛戒護鏉ヨ繘琛岃緭鍏ヨ緭鍑洪噸瀹氬悜銆傛垜浠笇鏈涙湰鏂囪兘澶熷府鎮ㄦ洿濂界殑浜嗚В<a target="_blank">Linux</a>涓嬬殑綆¢亾鎶鏈?/p> <p> </p> <p align="left"><br /></p><img src ="http://m.shnenglu.com/jackdongy/aggbug/197055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/jackdongy/" target="_blank">jackdong</a> 2013-01-07 10:05 <a href="http://m.shnenglu.com/jackdongy/archive/2013/01/07/197055.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>ubuntu涓媔bus鐨勮緗?http://m.shnenglu.com/jackdongy/archive/2013/01/05/196959.htmljackdongjackdongSat, 05 Jan 2013 00:59:00 GMThttp://m.shnenglu.com/jackdongy/archive/2013/01/05/196959.htmlhttp://m.shnenglu.com/jackdongy/comments/196959.htmlhttp://m.shnenglu.com/jackdongy/archive/2013/01/05/196959.html#Feedback0http://m.shnenglu.com/jackdongy/comments/commentRss/196959.htmlhttp://m.shnenglu.com/jackdongy/services/trackbacks/196959.htmlhttp://blog.csdn.net/lixiaoyuaini/article/details/5551852

ubuntu 瑁呭ソ鍚庯紝榛樿鐨刬bus杈撳叆娉曞彧鑳借緭鍏ュ崟涓眽瀛楋紝鍥犳闇瑕佽嚜宸變慨鏀廣傞鍏堝湪緇堢鍗歌澆ibus錛?br />sudo apt-get remove ibus
瀹屾垚鍚庤繍琛屽畨瑁?br />sudo apt-get install ibus
sudo apt-get install ibus-pinyin


涓鑸郴緇熶細鎻愮ず錛?/span>
IBus 宸茬粡鎴愬姛鍚姩錛佸鏋滀綘涓嶈兘姝e父浣跨敤 IBus錛岃灝嗕笅闈唬鐮佸姞鍏ュ埌 $HOME/.bashrc涓紝騫墮噸鏂扮櫥褰曟闈€?br />export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus

鍥犳鍙互鑷繁淇敼.bashrc鏂囦歡銆傛鏂囦歡鍘熷唴瀹瑰涓嬭摑鑹查儴鍒嗘墍紺猴紝綰㈣壊閮ㄥ垎涓烘牴鎹郴緇熸坊鍔犵殑鍐呭銆?br />
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# don't put duplicate lines in the history. See bash(1) for more options
# don't overwrite GNU Midnight Commander's setting of `ignorespace'.
HISTCONTROL=$HISTCONTROL${HISTCONTROL+,}ignoredups
# ... or force ignoredups and ignorespace
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi

if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}/[/033[01;32m/]/u@/h/[/033[00m/]:/[/033[01;34m/]/w/[/033[00m/]/$ '
else
PS1='${debian_chroot:+($debian_chroot)}/u@/h:/w/$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="/[/e]0;${debian_chroot:+($debian_chroot)}/u@/h: /w/a/]$PS1"
;;
*)
;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'

alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi

# some more ls aliases
#alias ll='ls -l'
#alias la='ls -A'
#alias l='ls -CF'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi


export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus

 

鐒跺悗閲嶅惎銆?br />



jackdong 2013-01-05 08:59 鍙戣〃璇勮
]]>
2011-03-04 20:26 Linux ./configure --prefix鍛戒護http://m.shnenglu.com/jackdongy/archive/2013/01/04/196940.htmljackdongjackdongFri, 04 Jan 2013 06:47:00 GMThttp://m.shnenglu.com/jackdongy/archive/2013/01/04/196940.htmlhttp://m.shnenglu.com/jackdongy/comments/196940.htmlhttp://m.shnenglu.com/jackdongy/archive/2013/01/04/196940.html#Feedback0http://m.shnenglu.com/jackdongy/comments/commentRss/196940.htmlhttp://m.shnenglu.com/jackdongy/services/trackbacks/196940.htmlhttp://hi.baidu.com/raybin_yang/item/52fb4315ed99de05d0d66da2

2011-03-04 20:26

Linux ./configure --prefix鍛戒護

http://blog.csdn.net/xiyangfan/archive/2010/02/24/5321790.aspx

http://blog.dormforce.net/rox/2008/09/26/configure-prefixxxx%E7%9A%84%E4%BD%9C%E7%94%A8/

婧愮爜鐨勫畨瑁呬竴鑸敱3涓楠ょ粍鎴愶細閰嶇疆錛坈onfigure錛夈佺紪璇戯紙make錛夈佸畨瑁咃紙make install錛夛紝鍏蜂綋鐨勫畨瑁呮柟娉曚竴鑸綔鑰呴兘浼氱粰鍑烘枃妗o紝榪欓噷涓昏璁ㄨ閰嶇疆錛坈onfigure錛夈侰onfigure鏄竴涓彲鎵ц鑴氭湰錛屽畠鏈夊緢澶氶夐」錛屼嬌鐢ㄥ懡浠?/configure –help杈撳嚭璇︾粏鐨勯夐」鍒楄〃錛屽涓嬶細
-bash-3.00# ./configure --help
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
--cache-file=FILE     cache test results in FILE
--help             print this message
--no-create         do not create output files
--quiet, --silent     do not print `checking...' messages
--version           print the version of autoconf that created configure
Directory and file names:
--prefix=PREFIX       install architecture-independent files in PREFIX
                [/usr/local]
--exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                [same as prefix]
--bindir=DIR         user executables in DIR [EPREFIX/bin]
……….(鐪佺暐鑻ュ共)
寰堝鐨勯夐」錛屼釜浜鴻涓猴紝浣犲彲浠ュ拷鐣ュ叾浠栫殑涓鍒囷紝浣嗚鎶?#8212;prefix鍔犱笂銆傝繖閲屼互瀹夎supersparrow-0.0.0涓轟緥錛屾垜浠墦綆楁妸瀹冨畨瑁呭埌鐩綍 /usr/local/supersparrow,浜庢槸鍦╯upersparrow-0.0.0鐩綍鎵ц甯﹂夐」鐨勮剼鏈?/configure --prefix=/usr/local/supersparrow,鎵ц鎴愬姛鍚庡啀緙栬瘧銆佸畨瑁咃紙make錛宮ake install錛夛紱瀹夎瀹屾垚灝嗚嚜鍔ㄧ敓鎴愮洰褰晄upersparrow,鑰屼笖璇ヨ蔣浠舵墍鏈夌殑鏂囦歡閮借澶嶅埗鍒拌繖涓洰褰曘備負浠涔堣鎸囧畾榪欎釜瀹夎鐩綍錛熸槸涓轟簡浠ュ悗鐨勭淮鎶ゆ柟渚匡紝濡傛灉娌℃湁鐢ㄨ繖涓夐」錛屽畨瑁呰繃紼嬬粨鏉熷悗錛岃杞歡鎵闇鐨勮蔣浠惰澶嶅埗鍒頒笉鍚岀殑緋葷粺鐩綍涓嬶紝寰堥毦寮勬竻妤氬埌搴曞鍒朵簡閭d簺鏂囦歡銆侀兘澶嶅埗鍒板摢閲屽幓浜?#8212;鍩烘湰涓婃槸涓濉岀硦娑傘?br />
鐢ㄤ簡—prefix閫夐」鐨勫彟涓涓ソ澶勬槸鍗歌澆杞歡鎴栫Щ妞嶈蔣浠躲傚綋鏌愪釜瀹夎鐨勮蔣浠朵笉鍐嶉渶瑕佹椂錛屽彧欏葷畝鍗曠殑鍒犻櫎璇ュ畨瑁呯洰褰曪紝灝卞彲浠ユ妸杞歡鍗歌澆寰楀共騫插噣鍑錛涚Щ妞嶈蔣浠跺彧闇鎷瘋礉鏁翠釜鐩綍鍒板彟澶栦竴涓満鍣ㄥ嵆鍙紙鐩稿悓鐨勬搷浣滅郴緇燂級銆?br />
涓涓皬閫夐」鏈夎繖涔堟柟渚跨殑浣滅敤錛屽緩璁湪瀹為檯宸ヤ綔涓澶氫嬌鐢?/p>---涓嶆寚瀹歱refix錛屽彲鎵ц鏂囦歡榛樿鏀懼湪/usr /local/bin錛屽簱鏂囦歡榛樿鏀懼湪/usr/local/lib錛岄厤緗枃浠墮粯璁ゆ斁鍦?usr/local/etc銆傚叾瀹冪殑璧勬簮鏂囦歡鏀懼湪/usr /local/share銆傝鍗歌澆榪欎釜紼嬪簭錛岃涔堝湪鍘熸潵鐨刴ake鐩綍涓嬬敤涓嬈ake uninstall錛堝墠鎻愭槸make鏂囦歡鎸囧畾榪噓ninstall錛?瑕佷箞鍘諱笂榪扮洰褰曢噷闈㈡妸鐩稿叧鐨勬枃浠朵竴涓釜鎵嬪伐鍒犳帀銆傛寚瀹歱refix錛岀洿鎺ュ垹鎺変竴涓枃浠跺す灝卞浜嗐?/div>

jackdong 2013-01-04 14:47 鍙戣〃璇勮
]]>ubuntu--top鍛戒護璇﹁В http://m.shnenglu.com/jackdongy/archive/2012/10/24/193815.htmljackdongjackdongWed, 24 Oct 2012 14:43:00 GMThttp://m.shnenglu.com/jackdongy/archive/2012/10/24/193815.htmlhttp://m.shnenglu.com/jackdongy/comments/193815.htmlhttp://m.shnenglu.com/jackdongy/archive/2012/10/24/193815.html#Feedback0http://m.shnenglu.com/jackdongy/comments/commentRss/193815.htmlhttp://m.shnenglu.com/jackdongy/services/trackbacks/193815.html

top 鍛戒護璇﹁В

鐗堟潈澹版槑錛氬彲浠ヤ換鎰忚漿杞斤紝浣嗚漿杞芥椂蹇呴』鏍囨槑鍘熶綔鑰卌harlee銆佸師濮嬮摼鎺?a >http://tech.idv2.com/2006/08/16/top-command/浠ュ強鏈0鏄庛?/p>

top鍛戒護鏄疞inux涓嬪父鐢ㄧ殑鎬ц兘鍒嗘瀽宸ュ叿錛岃兘澶熷疄鏃舵樉紺虹郴緇熶腑鍚勪釜榪涚▼鐨勮祫婧愬崰鐢ㄧ姸鍐碉紝綾諱技浜嶹indows鐨勪換鍔$鐞嗗櫒銆備笅闈㈣緇嗕粙緇嶅畠鐨勪嬌鐢ㄦ柟娉曘?


璁よ瘑top鐨勬樉紺虹粨鏋?p>top鍛戒護鐨勬樉紺虹粨鏋滃涓嬫墍紺猴細

top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48
Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 191272k total, 173656k used, 17616k free, 22052k buffers
Swap: 192772k total, 0k used, 192772k free, 123988k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1379 root 16 0 7976 2456 1980 S 0.7 1.3 0:11.03 sshd
14704 root 16 0 2128 980 796 R 0.7 0.5 0:02.72 top
1 root 16 0 1992 632 544 S 0.0 0.3 0:00.90 init
2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0緇熻淇℃伅鍖?p>鍓嶄簲琛屾槸緋葷粺鏁翠綋鐨勭粺璁′俊鎭傜涓琛屾槸浠誨姟闃熷垪淇℃伅錛屽悓 uptime 鍛戒護鐨勬墽琛岀粨鏋溿傚叾鍐呭濡備笅錛?/p> 01:06:48 褰撳墠鏃墮棿 up 1:22 緋葷粺榪愯鏃墮棿錛屾牸寮忎負鏃?鍒? 1 user 褰撳墠鐧誨綍鐢ㄦ埛鏁? load average: 0.06, 0.60, 0.48 緋葷粺璐熻澆錛屽嵆浠誨姟闃熷垪鐨勫鉤鍧囬暱搴︺?br /> 涓変釜鏁板煎垎鍒負 1鍒嗛挓銆?鍒嗛挓銆?5鍒嗛挓鍓嶅埌鐜板湪鐨勫鉤鍧囧箋?

絎簩銆佷笁琛屼負榪涚▼鍜孋PU鐨勪俊鎭傚綋鏈夊涓狢PU鏃訛紝榪欎簺鍐呭鍙兘浼氳秴榪囦袱琛屻傚唴瀹瑰涓嬶細

Tasks: 29 total 榪涚▼鎬繪暟 1 running 姝e湪榪愯鐨勮繘紼嬫暟 28 sleeping 鐫$湢鐨勮繘紼嬫暟 0 stopped 鍋滄鐨勮繘紼嬫暟 0 zombie 鍍靛案榪涚▼鏁? Cpu(s): 0.3% us 鐢ㄦ埛絀洪棿鍗犵敤CPU鐧懼垎姣? 1.0% sy 鍐呮牳絀洪棿鍗犵敤CPU鐧懼垎姣? 0.0% ni 鐢ㄦ埛榪涚▼絀洪棿鍐呮敼鍙樿繃浼樺厛綰х殑榪涚▼鍗犵敤CPU鐧懼垎姣? 98.7% id 絀洪棽CPU鐧懼垎姣? 0.0% wa 絳夊緟杈撳叆杈撳嚭鐨凜PU鏃墮棿鐧懼垎姣? 0.0% hi 0.0% si

鏈鍚庝袱琛屼負鍐呭瓨淇℃伅銆傚唴瀹瑰涓嬶細

Mem: 191272k total 鐗╃悊鍐呭瓨鎬婚噺 173656k used 浣跨敤鐨勭墿鐞嗗唴瀛樻婚噺 17616k free 絀洪棽鍐呭瓨鎬婚噺 22052k buffers 鐢ㄤ綔鍐呮牳緙撳瓨鐨勫唴瀛橀噺 Swap: 192772k total 浜ゆ崲鍖烘婚噺 0k used 浣跨敤鐨勪氦鎹㈠尯鎬婚噺 192772k free 絀洪棽浜ゆ崲鍖烘婚噺 123988k cached 緙撳啿鐨勪氦鎹㈠尯鎬婚噺銆?br /> 鍐呭瓨涓殑鍐呭琚崲鍑哄埌浜ゆ崲鍖猴紝鑰屽悗鍙堣鎹㈠叆鍒板唴瀛橈紝浣嗕嬌鐢ㄨ繃鐨勪氦鎹㈠尯灝氭湭琚鐩栵紝
璇ユ暟鍊煎嵆涓鴻繖浜?strong>鍐呭宸插瓨鍦ㄤ簬鍐呭瓨涓?/strong>鐨勪氦鎹㈠尯鐨勫ぇ灝忋?br /> 鐩稿簲鐨勫唴瀛樺啀嬈¤鎹㈠嚭鏃跺彲涓嶅繀鍐嶅浜ゆ崲鍖哄啓鍏ャ? 榪涚▼淇℃伅鍖?p>緇熻淇℃伅鍖哄煙鐨勪笅鏂規樉紺轟簡鍚勪釜榪涚▼鐨勮緇嗕俊鎭傞鍏堟潵璁よ瘑涓涓嬪悇鍒楃殑鍚箟銆?/p> 搴忓彿 鍒楀悕 鍚箟 a PID 榪涚▼id b PPID 鐖惰繘紼媔d c RUSER Real user name d UID 榪涚▼鎵鏈夎呯殑鐢ㄦ埛id e USER 榪涚▼鎵鏈夎呯殑鐢ㄦ埛鍚? f GROUP 榪涚▼鎵鏈夎呯殑緇勫悕 g TTY 鍚姩榪涚▼鐨勭粓绔悕銆備笉鏄粠緇堢鍚姩鐨勮繘紼嬪垯鏄劇ず涓?? h PR 浼樺厛綰? i NI nice鍊箋傝礋鍊艱〃紺洪珮浼樺厛綰э紝姝e艱〃紺轟綆浼樺厛綰? j P 鏈鍚庝嬌鐢ㄧ殑CPU錛屼粎鍦ㄥCPU鐜涓嬫湁鎰忎箟 k %CPU 涓婃鏇存柊鍒扮幇鍦ㄧ殑CPU鏃墮棿鍗犵敤鐧懼垎姣? l TIME 榪涚▼浣跨敤鐨凜PU鏃墮棿鎬昏錛屽崟浣嶇 m TIME+ 榪涚▼浣跨敤鐨凜PU鏃墮棿鎬昏錛屽崟浣?/100縐? n %MEM 榪涚▼浣跨敤鐨?strong>鐗╃悊鍐呭瓨
鐧懼垎姣? o VIRT 榪涚▼浣跨敤鐨勮櫄鎷熷唴瀛樻婚噺錛屽崟浣峩b銆俈IRT=SWAP+RES p SWAP 榪涚▼浣跨敤鐨勮櫄鎷熷唴瀛樹腑錛岃鎹㈠嚭鐨勫ぇ灝忥紝鍗曚綅kb銆? q RES 榪涚▼浣跨敤鐨勩佹湭琚崲鍑虹殑鐗╃悊鍐呭瓨澶у皬錛屽崟浣峩b銆俁ES=CODE+DATA r CODE 鍙墽琛屼唬鐮佸崰鐢ㄧ殑鐗╃悊鍐呭瓨澶у皬錛屽崟浣峩b s DATA 鍙墽琛屼唬鐮佷互澶栫殑閮ㄥ垎(鏁版嵁孌?鏍?鍗犵敤鐨?strong>鐗╃悊
鍐?瀛樺ぇ灝忥紝鍗曚綅kb t SHR 鍏變韓鍐呭瓨澶у皬錛屽崟浣峩b u nFLT 欏甸潰閿欒嬈℃暟 v nDRT 鏈鍚庝竴嬈″啓鍏ュ埌鐜板湪錛岃淇敼榪囩殑欏甸潰鏁般? w S 榪涚▼鐘舵併?br /> D=涓嶅彲涓柇鐨勭潯鐪犵姸鎬?br /> R=榪愯
S=鐫$湢
T=璺熻釜/鍋滄
Z= 鍍靛案榪涚▼ x COMMAND 鍛戒護鍚?鍛戒護琛? y WCHAN 鑻ヨ榪涚▼鍦ㄧ潯鐪狅紝鍒欐樉紺虹潯鐪犱腑鐨勭郴緇熷嚱鏁板悕 z Flags 浠誨姟鏍囧織錛屽弬鑰?sched.h

榛樿鎯呭喌涓嬩粎鏄劇ず姣旇緝閲嶈鐨?PID銆乁SER銆丳R銆丯I銆乂IRT銆丷ES銆丼HR銆丼銆?CPU銆?MEM銆乀IME+銆丆OMMAND 鍒椼傚彲浠ラ氳繃涓嬮潰鐨勫揩鎹烽敭鏉ユ洿鏀規樉紺哄唴瀹廣?/p>鏇存敼鏄劇ず鍐呭

閫氳繃 f 閿彲浠ラ夋嫨鏄劇ず鐨勫唴瀹廣傛寜 f 閿箣鍚庝細鏄劇ず鍒楃殑鍒楄〃錛屾寜 a-z 鍗沖彲鏄劇ず鎴栭殣钘忓搴旂殑鍒楋紝鏈鍚庢寜鍥炶濺閿‘瀹氥?/p>

鎸?o 閿彲浠ユ敼鍙樺垪鐨勬樉紺洪『搴忋傛寜灝忓啓鐨?a-z 鍙互灝嗙浉搴旂殑鍒楀悜鍙崇Щ鍔紝鑰屽ぇ鍐欑殑 A-Z 鍙互灝嗙浉搴旂殑鍒楀悜宸︾Щ鍔ㄣ傛渶鍚庢寜鍥炶濺閿‘瀹氥?/p>

鎸夊ぇ鍐欑殑 F 鎴?O 閿紝鐒跺悗鎸?a-z 鍙互灝嗚繘紼嬫寜鐓х浉搴旂殑鍒楄繘琛屾帓搴忋傝屽ぇ鍐欑殑 R 閿彲浠ュ皢褰撳墠鐨勬帓搴忓掕漿銆?/p>



jackdong 2012-10-24 22:43 鍙戣〃璇勮
]]>浣跨敤緙栬瘧鍣ㄦ潵浣跨敤瀹忓彉閲?http://m.shnenglu.com/jackdongy/archive/2012/10/21/193599.htmljackdongjackdongSun, 21 Oct 2012 04:41:00 GMThttp://m.shnenglu.com/jackdongy/archive/2012/10/21/193599.htmlhttp://m.shnenglu.com/jackdongy/comments/193599.htmlhttp://m.shnenglu.com/jackdongy/archive/2012/10/21/193599.html#Feedback0http://m.shnenglu.com/jackdongy/comments/commentRss/193599.htmlhttp://m.shnenglu.com/jackdongy/services/trackbacks/193599.htmlhttp://blog.csdn.net/bendanban/article/details/7753995
鍒氬浜嗕竴鎷涳紝鍙互浣跨敤緙栬瘧鍣ㄧ殑-D閫夐」鏉ュ畾涔夌▼搴忎腑浣跨敤鐨勫畯銆?
#include <stdio.h>
int main(int argc, char **argv)
{
    #ifdef MY_MAC
    printf(
"Hello -D.\n");
    
#else 
    printf(
"MY_MAC was not defined.\n");
    
#endif
    
return 0;
}
涓婇潰鐨勪唬鐮佷腑浣跨敤浜哅Y_MAC瀹忥紝

 

銆愩?g++ -DMY_MAC -o dtest dtest.c

鎵ц緇撴灉錛?/p>

銆愩? ./dtest 
Hello 
-D.
銆愩?

鏃犳帀-D閫夐」錛岄噸鏂扮紪璇戯紝鎵ц緇撴灉錛?

銆愩? g++ ./dtest.c -o dtest
銆愩? .
/dtest 
MY_MAC was not defined.

鎴戜滑鍙互鍒╃敤緙栬瘧鍣ㄨ繖涓夐」鏉ヨ皟璇曟垜浠殑紼嬪簭濂ャ?

 

濡傛灉鎴戠殑瀹忎唬琛ㄤ竴涓父閲忔庝箞鍔炲憿錛燂紵

鐪嬬湅淇敼鍚庣殑浠g爜錛?/p>

 

#include <stdio.h>
int main(int argc, char **argv)
{
    #ifdef MY_MAC
    printf(
"Hello -D. %d\n", MY_MAC);
    
#else 
    printf(
"MY_MAC was not defined.\n");
    
#endif
    
return 0;
}



鎴戣緭鍑轟簡瀹忎唬琛ㄧ殑鍊箋?

 

鍦ㄧ粓绔墽琛屼竴涓嬪懡浠わ細

 

銆愩? g++ -DMY_MAC=5 ./dtest.c -o dtest
銆愩? .
/dtest 
Hello 
-D. 5
銆愩?

濡傛灉紼嬪簭涓湁澶氫釜瀹忓彲浠ヨ繖鏍風紪璇?/p>

銆愩?g++ -DMAC1=5 -DMAC2=6 soucefile.c

^_^錛岋紝寰堝叴濂嬫槸鍚э紵錛熻繖鏍鋒垜浠氨涓嶇敤鍦ㄤ唬鐮侀噷淇敼瀹忓彉閲忎簡銆傘?br />





jackdong 2012-10-21 12:41 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲综合视频在线| 久久精品视频亚洲| 欧美日在线观看| 欧美不卡高清| 欧美国产1区2区| 欧美成在线视频| 欧美日韩一区二区在线视频 | 老色鬼精品视频在线观看播放 | 亚洲国产精品va在看黑人| 老色鬼精品视频在线观看播放| 玖玖玖免费嫩草在线影院一区| 欧美大片免费观看在线观看网站推荐| 欧美va亚洲va香蕉在线| 亚洲国产精品成人综合色在线婷婷| 亚洲国产精品ⅴa在线观看| 亚洲精品中文字幕在线| 亚洲淫片在线视频| 久久久久久综合| 欧美另类69精品久久久久9999| 国产精品多人| 红杏aⅴ成人免费视频| 亚洲精品久久久久久久久| 亚洲一区二区三区在线看| 美女脱光内衣内裤视频久久影院| 亚洲风情在线资源站| 久久这里只有精品视频首页| 免费在线亚洲欧美| 亚洲精选中文字幕| 欧美一级视频| 欧美精品一区在线发布| 国产日韩亚洲欧美精品| 亚洲精品在线视频| 久久精品日产第一区二区| 最新日韩在线视频| 久久精品国产亚洲一区二区| 欧美日韩ab片| 亚洲第一在线综合网站| 亚洲欧洲av一区二区三区久久| 玖玖玖国产精品| 亚洲欧美综合v| 欧美三区在线视频| 亚洲肉体裸体xxxx137| 久久精品视频在线免费观看| 在线综合亚洲| 欧美日韩成人激情| 亚洲欧洲另类国产综合| 美女黄网久久| 久久精品99| 国产主播一区二区三区| 欧美一区二区三区四区在线 | 欧美一区二区三区四区高清 | 男女精品网站| 国产日韩亚洲欧美精品| 亚洲一区二区三区四区五区午夜 | 一区二区在线不卡| 久久久久一区二区三区| 亚洲先锋成人| 国产精品久久久久久av下载红粉| 亚洲激情专区| 亚洲欧洲精品一区| 欧美理论在线| 99视频在线观看一区三区| 亚洲国产mv| 欧美高清视频在线播放| 亚洲青色在线| 欧美激情精品久久久久久| 麻豆国产va免费精品高清在线| 国外成人性视频| 免费观看不卡av| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲第一在线综合网站| 亚洲国产裸拍裸体视频在线观看乱了| 老司机一区二区三区| 伊人婷婷欧美激情| 欧美激情精品久久久久久久变态| 久久久美女艺术照精彩视频福利播放| 午夜久久电影网| 欧美一区日本一区韩国一区| 国产欧美日韩综合一区在线播放| 欧美一区成人| 亚洲婷婷在线| 免费日韩av| 一区二区在线看| 免费观看亚洲视频大全| 欧美中文在线观看| 伊人久久大香线| 欧美激情在线狂野欧美精品| 欧美激情在线狂野欧美精品| 一区二区电影免费观看| 99精品视频一区二区三区| 国产精品福利在线| 久久久www免费人成黑人精品 | 91久久国产综合久久91精品网站| 欧美黄色免费| 亚洲尤物在线| 久久av老司机精品网站导航| 亚洲第一视频| 亚洲一区二区少妇| 在线观看日韩www视频免费 | 亚洲毛片在线看| 国产精品美女久久久久aⅴ国产馆| 香蕉久久国产| 久久综合九色综合网站| 一区二区久久久久| 久久成年人视频| 夜夜精品视频一区二区| 亚洲免费在线观看| 亚洲人成小说网站色在线| 在线一区日本视频| 亚洲人体一区| 欧美中文字幕视频| 亚洲一区二区3| 久久婷婷综合激情| 亚洲欧美中日韩| 欧美风情在线| 久久最新视频| 国产色视频一区| 一区二区av在线| 亚洲人成在线影院| 久久视频一区二区| 久久久精品日韩欧美| 国产精品sm| 亚洲精品在线三区| 亚洲日本一区二区| 亚洲欧美日韩综合国产aⅴ| 在线天堂一区av电影| 裸体素人女欧美日韩| 久久久精品国产99久久精品芒果| 国产精品sss| 一区二区三区三区在线| 亚洲精品一级| 欧美激情精品久久久久| 亚洲高清久久| 亚洲精品久久在线| 欧美aaaaaaaa牛牛影院| 欧美成人在线影院| 亚洲高清123| 欧美高清不卡在线| 美女在线一区二区| 韩国成人精品a∨在线观看| 亚洲香蕉网站| 欧美一进一出视频| 国产网站欧美日韩免费精品在线观看 | 裸体素人女欧美日韩| 欧美va亚洲va日韩∨a综合色| 国产一区二区高清视频| 久久成人资源| 欧美国产日本| 99热在这里有精品免费| 欧美夫妇交换俱乐部在线观看| 亚洲国产另类久久精品| 在线一区二区视频| 国产精品久久久久久久久久久久 | 99精品免费视频| 欧美日韩蜜桃| 亚洲午夜激情网页| 久久精品系列| 日韩午夜剧场| 欧美午夜精品理论片a级大开眼界| 亚洲美女网站| 久久都是精品| 1024日韩| 国产精品海角社区在线观看| 亚洲欧美日韩国产综合在线| 老司机一区二区三区| 亚洲人成7777| 国产精品一区二区在线| 久久免费高清视频| 99国产精品久久久| 久久久精品日韩| 一区电影在线观看| 国户精品久久久久久久久久久不卡| 久久久久久夜| 亚洲男女毛片无遮挡| 欧美黄色影院| 久久九九热免费视频| 一区二区三区毛片| 国产日韩亚洲| 欧美日韩中国免费专区在线看| 先锋影音久久| 亚洲国产欧美国产综合一区 | 亚洲大胆在线| 国产精品xxx在线观看www| 久久九九精品99国产精品| 亚洲毛片一区二区| 老鸭窝91久久精品色噜噜导演| 亚洲少妇自拍| 亚洲国产日韩欧美在线动漫| 国产精品一区视频| 欧美日韩国产在线播放网站| 亚洲欧美文学| 一本色道婷婷久久欧美| 欧美激情一区二区三区在线视频观看| 亚洲一区二区三区国产| 亚洲欧洲久久| 在线亚洲+欧美+日本专区| 亚洲黄一区二区三区| 9i看片成人免费高清| 在线日韩成人| 国模一区二区三区|