(1) 在理解程序的概念及其生命週期和狀態轉換過程的基礎上,進行程序相關程式設計;(2) 在理解程序間通訊的基本原理的基礎上,程式設計實現程序間通訊。
(1) 在linux中利用fork()在父程序a中建立乙個子程序b,再在子程序a中建立乙個子程序c,在3個程序中都要編寫適當的語句模擬程序的工作。(1)實驗**;(2) 建立子程序時將複製父程序的所有內容,此時的複製物件也包含套接字檔案描述符。編寫程式驗證複製的檔案描述符整數值是否與原檔案描述符整數值相同。
(3) 如果在未註冊sigint訊號的情況下輸入ctrl+c,將由作業系統預設的事件處理器終止程式。但如果直接註冊ctrl+c訊號的處理器,則程式不會終止,而是呼叫程式設計師指定的事件處理器。編寫註冊處理函式的程式,完成如下功能:
「輸入ctrl+c時,詢問是否確定退出程式,輸入y則終止程式。」
另外,編寫程式使其每隔1秒輸出簡單字串,並適用於上述時間處理器註冊**。
(4) 利用fork()實現併發伺服器,且讓客戶端的讀寫操作由兩個程序分別處理。
(5) 編寫程式實現程序間通訊,使2個程序相互交換3次字串。當然,這2個程序應具有父子關係,各位可指定任意字串。
/*進入子程序建立子程序*/
#include
#include
#include
#include
#include
intossion()
;//函式的申明
int flag =0;
//全域性變數
intmain
(int argc,
char
**ar**)
intossion()
waitpid
(pid,
null
,wuntraced);}
return0;
}
結果:
(2)實現**:
fork1.c:
#include
#include
#include
intmain
(int argc,
char
*ar**)
結果:
(3)實現**
fork2.c:
#include
#include
#include
void
ctrl_handler
(int sig)
;int
main
(int argc,
char
*ar**)
return0;
}void
ctrl_handler
(int sig)
結果:
(4)實現**:
server.c:
#include
#include
#include
#include
#include
#include
#include
#include
#define buf_size 30
void
error_handling
(char
*message)
;void
read_childproc
(int sig)
;int
main
(int argc,
char
*ar**)
act.sa_handler=read_childproc;
sigemptyset
(&act.sa_mask)
; act.sa_flags=0;
state=
sigaction
(sigchld,
&act,0)
; serv_sock=
socket
(pf_inet, sock_stream,0)
;memset
(&serv_adr,0,
sizeof
(serv_adr));
serv_adr.sin_family=af_inet;
serv_adr.sin_addr.s_addr=
htonl
(inaddr_any)
; serv_adr.sin_port=
htons
(atoi
(ar**[1]
));if
(bind
(serv_sock,
(struct sockaddr*
)&serv_adr,
sizeof
(serv_adr))==
-1)error_handling
("bind() error");
if(listen
(serv_sock,5)
==-1)
error_handling
("listen() error");
while(1
)if(pid==0)
else
close
(clnt_sock);}
close
(serv_sock)
;return0;
}void
read_childproc
(int sig)
void
error_handling
(char
*message)
client.c:
#include
#include
#include
#include
#include
#include
#define buf_size 1024
void
error_handling
(char
*message)
;int
main
(int argc,
char
*ar**)
sock=
socket
(pf_inet, sock_stream,0)
;if(sock==-1
)error_handling
("socket() error");
memset
(&serv_adr,0,
sizeof
(serv_adr));
serv_adr.sin_family=af_inet;
serv_adr.sin_addr.s_addr=
inet_addr
(ar**[1]
);serv_adr.sin_port=
htons
(atoi
(ar**[2]
));if
(connect
(sock,
(struct sockaddr*
)&serv_adr,
sizeof
(serv_adr))==
-1)error_handling
("connect() error!");
else
puts
("connected...........");
while(1
)close
(sock)
;return0;
}void
error_handling
(char
*message)
結果:
(5)實現**:
fork_message.c:
#include
#include
#include
#define buf_size 30
intmain
(int argc,
char
*ar**)
;char buf[buf_size]
; pid_t pid;
int i;
pipe
(fds1)
,pipe
(fds2)
; pid=
fork()
;if(pid==0)
}else
}return0;
}
Linux UNIX網路程式設計筆記(四) UDP程式設計
udp客戶 伺服器的套接字函式 recvfrom 函式 接收資料,類似標準read include include ssize t recvfrom int sockfd,void buf,size t len,int flags,struct sockaddr from,size t addrle...
TCP IP網路編學習筆記 三
可以設定tcp或udp通訊的輸入緩衝大小和輸出緩衝大小,但是最終大小並不一定是你所設定的大小 如果服務端先close,或者說先發出fin訊息表示分手,則服務端斷開連線後,在短時間內無法再次bind相同的埠,因為上一次繫結此埠的socket處於time wait過程中,還未被銷毀 不過此時客戶端是沒有...
TCP IP網路程式設計
tcp ip 是供已連線網際網路的計算機進行通訊的通訊協議。tcp ip 定義了裝置 並非只有計算機 如何連入網際網路,以及資料如何在它們之間傳輸的標準。ip internet protocol 網際網路協議。從這個名稱我們就可以知道ip協議的重要性。在現實生活中,我們進行貨物運輸時都是把貨物包裝成...