- 論壇徽章:
- 0
|
本帖最后由 sjdy521 于 2014-08-27 17:54 編輯
- use Socket;
- socketpair(my $master_fd,my $worker_fd,AF_UNIX,SOCK_STREAM,0) or die $!;
- if(fork ==0){#worker
- sleep 1;
- shutdown $worker_fd,2;
- }
- else{#master
- while(<$master_fd>){
- print;
-
復(fù)制代碼- use Socket;
- socketpair(my $master_fd,my $worker_fd,AF_UNIX,SOCK_STREAM,0) or die $!;
- if(fork ==0){#worker
- sleep 1;
- close $worker_fd;
- }
- else{#master
- while(<$master_fd>){
- print;
- }
- }
復(fù)制代碼 兩段代碼,本以為close和shutdown SOCKET,2都是關(guān)閉整個(gè)連接的意思,沒想到實(shí)際測(cè)試發(fā)現(xiàn)差異很大
第一段代碼因?yàn)樽舆M(jìn)程關(guān)閉了整個(gè)連接的讀寫,主進(jìn)程也讀取到eof而退出,第二段代碼使用了close來(lái)關(guān)閉fd,但這種關(guān)閉卻只對(duì)子進(jìn)程有效(fd的引用計(jì)數(shù)問題吧),完全沒有影響到主進(jìn)程。主進(jìn)程仍然因?yàn)闆]有讀到數(shù)據(jù)而阻塞住
看來(lái)以后真不能把close和shutdown亂用,但socket編程里為什么這點(diǎn)不能做到統(tǒng)一呢,不是很理解 |
|