freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

一種遠(yuǎn)程管理linux系統(tǒng)工具的設(shè)計(jì)與實(shí)現(xiàn)—免費(fèi)計(jì)算機(jī)(編輯修改稿)

2024-09-20 11:23 本頁面
 

【文章內(nèi)容簡介】 存中去;第三步是關(guān)閉打開的文件。? 在 Linux 中打開一個(gè)文件可以通過系統(tǒng)調(diào)用 open()函數(shù)來實(shí)現(xiàn):int fd = open(char *name,int how)。其中參數(shù) name 是要打開的函數(shù)名字;how 是打開的方式;返回值1 為錯(cuò)誤,成功就返回一個(gè)文件描述符。? Linux 系統(tǒng)讀取文件內(nèi)容通過系統(tǒng)調(diào)用 read()函數(shù)來實(shí)現(xiàn),函數(shù)原形:ssize_t numread = read(int fd,void *buff,size_t qty)。第 1 個(gè)參數(shù)是打開的文件描述符,第 2 個(gè)參數(shù)是存儲(chǔ)文件數(shù)據(jù)的內(nèi)存地址,第 3 個(gè)參數(shù)是讀取數(shù)據(jù)大小。如果讀取成功返回值是讀取的字節(jié)數(shù),失敗就返回1。? 系統(tǒng)調(diào)用 write()函數(shù)將內(nèi)存中的數(shù)據(jù)寫入到文件中去,函數(shù)原形:ssize_t resut = write(int fd,void *buff,zize_t amt)。這個(gè)系統(tǒng)將調(diào)用 buff 的數(shù)據(jù)寫到文件中。第 1 個(gè)參數(shù)是打開的文件描述符;第 2 個(gè)參數(shù)是要寫入文件數(shù)據(jù)的內(nèi)存地址;第 3 個(gè)參數(shù)是寫入文件的大小。進(jìn)程不需要再對文件進(jìn)行讀寫操作時(shí),就要關(guān)系文件打開的文件。close()能關(guān)閉打開的文件,其函數(shù)原形:int result = close(int fd)。這個(gè)系統(tǒng)調(diào)用會(huì)關(guān)閉進(jìn)程和文件之間的連接。參數(shù)是打開的文件描述符號(hào)。關(guān)閉成功返回 0,失敗返回1。 進(jìn)程和線程的使用(1) Linux 進(jìn)程Linux 進(jìn)程創(chuàng)建很特別。很多其他操作都提供了產(chǎn)生進(jìn)程的機(jī)制,在新的進(jìn)程空間中創(chuàng)建進(jìn)程,讀取可執(zhí)行文件。但是 Linux 不同,它創(chuàng)建的子進(jìn)程具有和父進(jìn)程相同的數(shù)據(jù)、代碼段。父進(jìn)程和子進(jìn)程間的區(qū)別就是進(jìn)程的 pid 不同,其他的都一樣:pid_t result = fork(void)該函數(shù)比較特殊,它返回兩次函數(shù)值,一次返回值是向父進(jìn)程返回子進(jìn)程的 PID。還有一次是返回 0(子進(jìn)程)。在使用 fork()函數(shù)創(chuàng)建進(jìn)程的時(shí)候經(jīng)常父進(jìn)程等待子進(jìn)程結(jié)束。系統(tǒng)調(diào)用wait(amp。status)讓父進(jìn)程阻塞直到子進(jìn)程結(jié)束:pid_t result = wait(amp。status)。(2) Linux 線程進(jìn)程為線程提供了運(yùn)行環(huán)境,多個(gè)函數(shù)可以同時(shí)運(yùn)行,但是他們都是運(yùn)行在相同的進(jìn)程中的。pthread_cearte()函數(shù)可以創(chuàng)建一個(gè)線程:int pthread_ceate(pthread_t *thread,pthread_attr_t *attr,void *(*func)(void*),void *arg)。4 基本的套接口編程 概述讓同一網(wǎng)絡(luò)的不同計(jì)算機(jī)的進(jìn)程能夠相互通信,首先要確定這些程序如何進(jìn)行通信。本課題所用的協(xié)議是 TCP/IP 協(xié)議。如果客戶和服務(wù)器處于同一以太網(wǎng),如圖 1 所示。應(yīng)用層協(xié)議客戶應(yīng)用程序 服務(wù)器應(yīng)用程序TCP TCPIP IP以太網(wǎng)驅(qū)動(dòng)以 太 網(wǎng) 驅(qū) 動(dòng)以太網(wǎng)驅(qū)動(dòng)TCP 協(xié)議IP 協(xié)議以太網(wǎng)協(xié)議圖 1 網(wǎng)絡(luò)示意圖 簡單的網(wǎng)絡(luò)編程(1) socket 函數(shù)socket 函數(shù)功能是創(chuàng)建一個(gè)套接口描述符,并且指定希望的通信協(xié)議(使用 IPV4 的TCP,或者使用 IPV6 的 UPD 等)。int socket(int family,int type,int protocol)。其中 family 參數(shù)指明協(xié)議族,type 參數(shù)指明套接口類型,protocol 參數(shù)為某個(gè)協(xié)議的常數(shù)。函數(shù)調(diào)用成功時(shí)候返回一個(gè)非負(fù)的描述符。(2) connect 函數(shù)TCP 客戶程序用 connect 函數(shù)來發(fā)起和 TCP 服務(wù)程序的連接。這個(gè)函數(shù)通常是在客戶程序中使用。int connect(int sockfd,const sgruct sockaddr *servaddr,socklen_t addrlen)。sockfd 是有 socket 函數(shù)返回的一個(gè)套接口描述符,第 2 個(gè)和第 3 個(gè)參數(shù)分別是一個(gè)指向套接口地址結(jié)構(gòu)指針和結(jié)構(gòu)的大小。當(dāng)函數(shù)調(diào)用成功的時(shí)候返回 0,出錯(cuò)就返回1。(3) bind 函數(shù)該函數(shù)是把一個(gè)本地協(xié)議地址賦予一個(gè)套接口,對于網(wǎng)際協(xié)議,協(xié)議地址是一個(gè) 32 位的 IPV4 地址和一個(gè) 16 位的 TCP 端口號(hào)的組合。int bind(int sockfd,const struct aockaddr *myadd,socklen_t addrlen)。第 2 個(gè)參數(shù)是一個(gè)指向特定協(xié)議的地址結(jié)構(gòu)的指針,第 3 個(gè)參數(shù)是該地址結(jié)構(gòu)的長度。調(diào)用成功返回 0,錯(cuò)誤返回1。(4) listen 函數(shù)listen 函數(shù)只能由 TCP 服務(wù)器調(diào)用,他完成兩件事:一是當(dāng) socket 函數(shù)創(chuàng)建一個(gè)套接口時(shí)它是一個(gè)主動(dòng)的套接口,該函數(shù)就是把它轉(zhuǎn)換成一個(gè)被動(dòng)的套接口二是該函數(shù)規(guī)定了為相應(yīng)套接口排隊(duì)的最大的連接個(gè)數(shù)。int listen(int sockfd,int backlog)。本函數(shù)通常都是在調(diào)用 socket 和 bind 這兩個(gè)函數(shù)之后。(5) accept 函數(shù)int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen)。參數(shù) cliaddr 和 addrlen 用來返回已經(jīng)連接的客戶端的協(xié)議地址。函數(shù)返回值為一個(gè)非負(fù)的描述符表示成功,出錯(cuò)為1。這里需要指出的是參數(shù)的描述符為監(jiān)聽套接口,就是在等待連接的時(shí)候還沒有建立連接的套接口,而返回值是連接的新的套接口。也就是能和客戶端通信的套接口。區(qū)分這兩個(gè)東西是很重要的。(6)close 函數(shù)套接口編程通常都需要一個(gè) close 函數(shù)來關(guān)閉套接口,來中斷 TCP 的連接。int close(int sockfd)。(7)send()函數(shù)當(dāng)連接建立了后自然就需要數(shù)據(jù)的傳送和接收,send()函數(shù)是用來想連接的另外一端發(fā)送數(shù)據(jù)。int send(int sockfd,void *buf,int len,int flags)。第 1 個(gè)參數(shù)是已經(jīng)連接的套接口的描述符,第 2 個(gè)參數(shù)是發(fā)送的數(shù)據(jù)的內(nèi)存地址,第3 個(gè)參數(shù)是發(fā)送數(shù)據(jù)的大小,第 4 個(gè)參數(shù)是選項(xiàng)。(8)recv()函數(shù)數(shù)據(jù)發(fā)送到接收端了后,就可以用 recv()函數(shù)來接收由發(fā)送端發(fā)送過來的數(shù)據(jù)了。int recv(int sockfd,void *buf,int len,int flags)第 1 個(gè)參數(shù)是已經(jīng)連接的套接口的描述符,第 2 個(gè)參數(shù)是發(fā)送的數(shù)據(jù)的內(nèi)存地址,第3 個(gè)參數(shù)是發(fā)送數(shù)據(jù)的大小,第 4 個(gè)參數(shù)是選項(xiàng)。5 程序設(shè)計(jì)和流程圖 設(shè)計(jì)思路本課題是采用 C/S 模式??蛻舫绦蚬δ苁墙缑娴木帉懀⒑头?wù)程序通信。采用 GTK編寫界面,采用 Sock 編程實(shí)現(xiàn)通信。服務(wù)器程序功能是接收客戶程序的數(shù)據(jù),并且通過收到的數(shù)據(jù)來完成系統(tǒng)或應(yīng)用服務(wù)程序文件的配置。在 Linux 中服務(wù)配置文件主要是以文本文件的形式存在的,所以通過 Linux 系統(tǒng)調(diào)用很容易修改配置文件,流程如圖 2。處理請求否是初始化數(shù)據(jù)退出連接不成功main()連接界面輸入服務(wù)器 IP建立連接(TCP3 次握手)用戶主界面用戶操作等待連接TCP 接口退出TCP 接口連接成功圖 2 程序總體流程 服務(wù)程序 流程設(shè)計(jì)服務(wù)程序功能有兩個(gè):一是監(jiān)聽端口,接收數(shù)據(jù)和向客戶程序發(fā)送數(shù)據(jù);二是根據(jù)客戶程序發(fā)送過來的數(shù)據(jù)對文件修改,其流程圖如圖 3 所示。圖 3 顯示了服務(wù)程序的流程,accept()是監(jiān)聽端口,等待客戶程序的連接,連接建立好后 init_cli()函數(shù)從配置文件讀取服務(wù)器的當(dāng)前配置文件數(shù)據(jù),然后再發(fā)送到客戶程序,讓客戶程序通過這些數(shù)據(jù)來初始化界面。然后再接收客戶程序的數(shù)據(jù)(流程控制字符串),通過判斷字符串來控制服務(wù)程序的流程(圖 3 中的虛線部分)。結(jié)束結(jié)束圖 3 服務(wù)程序的流程圖 功能模塊(1) 系統(tǒng)用戶管理操作和客戶程序建立了連接,并且收到了 user 字符串后,服務(wù)程序進(jìn)入系統(tǒng)用戶管理操作模塊,接著接收客戶程序發(fā)送過來的數(shù)據(jù)(字符串),通過數(shù)據(jù)來判斷是對用戶的添加、刪除、瀏覽或修改操作。接收到了“adduser”字符串就進(jìn)入添加用戶流程;接收到“deluser”字符串就進(jìn)入刪除用戶流程;接收到“scanuser”字符串就進(jìn)入了瀏覽用戶流程;接收到“property”字符串就進(jìn)入到了修改用戶流程,系統(tǒng)用戶管理操作流程如圖 4所示。dnsconfig vsftpcongroup_control()InitAction ()Net_DNS_Config ()Apache_Config ()Ftp_Config ()sysconfig apachecongroup程序入口sock()bind()listen()accep()t()一直阻塞到客戶連接到達(dá)連接建立TCP3 次握手init_cli ()userrecv ()對字符判斷exitclose ()user_control()字符串判斷處理圖 4 用戶操作流程對用戶的操作是添加、刪除和修改用戶,Linux 用戶都是記錄在/etc/passwd 文件中,把 temp 的數(shù)據(jù)fputs()到文件退出用戶操作到圖 3 的 recv()exitadduser scauserpropertyfclose()fopen()把 temp 中的數(shù)據(jù) fputs()到文件中fputs(str)fopen()是否否是把 temp 中的數(shù)據(jù) fputs()到文件中把讀取數(shù)據(jù)存到 2 維數(shù)組 temp 中把 str 存到 2 維數(shù)組 temp 中fclose()fopen()相同接收的字符和讀取字符不同否 為空把讀取數(shù)據(jù)存到 2 維數(shù)組temp 中fopen()fget()為空fopen()把接受的數(shù)據(jù)格式化存儲(chǔ)在字符串str 中fclose()把接受的數(shù)據(jù)格式化存儲(chǔ)在字符串str 中fopen()fget()user_control()recv()字符recv() recv() recv()fopen()fget() send()fget()為空相同把讀取數(shù)據(jù)存到 2 維數(shù)組temp 中接收的字符和讀取字符不同對用戶添加、刪除和修改都是通過修改/etc/passwd 文件來實(shí)現(xiàn)。/etc/passwd 的用戶都是按照統(tǒng)一存格式來存儲(chǔ),格式舉例如下:terrycheops:x:500:500:terrycheop:/home/terrycheops:/bin/bash存儲(chǔ)中每個(gè)字段都用“:”隔開的,第一字段:用戶名(也被稱為登錄名) ,在上面的例子中,我們看到用戶的用戶名是terrycheops;第二字段:口令,在例子中我們看到的是一個(gè)x,其實(shí)密碼已被映射到/etc/shadow 文件中;第三字段:用戶的ID;第四字段:用戶組的ID;第五字段:用戶名全稱,可選項(xiàng);第六字段:用戶的家目錄所在位置,該用戶的是/home/terrycheops。第七字段:用戶所用Shell的類型,一般設(shè)置為/bin/bash。程序進(jìn)入到了添加用戶后,接收客戶程序傳過來要添加的用戶信息(用戶名、密碼、全名)。把客戶程序發(fā)送過來的用戶密碼用 MD5 算法加密,把加密后的密碼和用戶其他數(shù)據(jù)按照/etc/passwd 的格式復(fù)制到字符串變量(str)中。用 C 語言的流的讀操作打開文件/etc/passwd,讀取/etc/passwd 中的每一行,把每次讀取的數(shù)據(jù)都復(fù)制到二維數(shù)組(temp)中,關(guān)閉文件。再以寫的形式打開文件,然后把上面二維數(shù)組(temp)的內(nèi)容寫到文件中,最后再把變量(str)寫到文件中,這樣就實(shí)現(xiàn)了用戶的添加。程序進(jìn)入到了刪除用戶流程后,接收客戶程序要?jiǎng)h除用戶的用戶名。用 C 中流的操作打開文件/etc/passwd,判斷讀取的數(shù)據(jù),當(dāng)要?jiǎng)h除的用戶名和讀取的用戶名一致時(shí)就不把這個(gè)用戶信息復(fù)制到二維數(shù)組(temp);讀取用戶名和刪除用戶名不一樣就把讀取數(shù)據(jù)復(fù)制到 temp 中。然后關(guān)閉這個(gè)流。重新以寫文件的操作打開文件/etc/passwd,然后把二維數(shù)組(temp)中的數(shù)據(jù)的以流的形式在寫入到文件/etc/passwd 中,這樣就實(shí)現(xiàn)了用戶的刪除。用戶修改過程,接收客戶程序發(fā)送過來的數(shù)據(jù)后,把接收的數(shù)據(jù)格式化復(fù)制到 str 中。以 C 語言中流的操作打開并且讀取文件/etc/passwd 的數(shù)據(jù),判斷讀取的數(shù)據(jù),當(dāng)要修改的用戶名和讀取的用戶名一致時(shí)把 str 數(shù)據(jù)復(fù)制到二維數(shù)組(temp);讀取用戶名和修改的用戶名不一致時(shí)就把讀取數(shù)據(jù)復(fù)制到 temp 中。然后關(guān)閉這個(gè)流。重新以寫文件的操作打開文件/etc/passwd,然后把二維數(shù)組(temp)中的數(shù)據(jù)以流的形式再寫入到文件/etc/passwd 中,這樣就完成了修改用戶的操作當(dāng)進(jìn)入瀏覽用戶的流程后,打開/etc/passwd 文件,把文件的數(shù)據(jù)讀取到 buff 中,再關(guān)閉文件,把 buff 的數(shù)據(jù)發(fā)送的到客戶程序,讓客戶程序顯示當(dāng)前的用戶信息。(2) 系統(tǒng)用戶組的操作用戶組(Group)配置文件主要有 /etc/group 和/etc/gshadow,其中/etc/gshadow 是/etc/group 的加密信息文件。etc/group 文件
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1