第一篇:Linux編程培訓哪個好
中國IT職業教育領先品牌
精品課程 全程面授
Linux編程培訓哪個好
想知道Linux編程培訓哪個好?先來了解一下什么是Linux編程吧!
Linux編程,比需要了解線程的問題。線程間通信之信號量
線程的信號量主要就是實現對公共資源的一種控制管理。當公共資源增加時,信號量的值增加;當公共資源減少時,信號量的值減少;只有信號量的值大于0時,才能訪問信號量所代表的公共資源。其實功能和之前的ucos的信號量功能類似。線程信號量初始化sem_init
intsem_init(sem_t *sem, intpshared, unsigned int value);功能介紹:
該函數主要的功能是創建一個信號量,設置該信號量的值,并且設置信號量的使用范圍。信號量創建成功后,可以對其進行加減操作。參數說明:
千鋒教育www.tmdps.cn
中國IT職業教育領先品牌
精品課程 全程面授
第一個參數sem是一個指向信號量結構的指針,當信號量初始化成功后,可以的這個信號量指針進行加減操作;第二個參數表示信號量的共享屬性,當其值不為0時,信號量可以在進程間共享,如果等于0,則只能在同一個進程中的多個線程間共享;第三個參數用于設置信號量初始化時候的值。2 線程信號量增加函數sem_post
intsem_post(sem_t *sem);功能介紹:
該函數用于增加信號量的值,每次增加值為1。當有線程在等待該信號量,則等待信號量返回,不增加信號量的值。參數說明:
sem參數是初始化時候創建的信號量結構體,用于記錄信號量值得參數。3 線程信號量減少函數sem_wait
intsem_wait(sem_t *sem);功能介紹:
該函數用于減少信號量的值,每次減少值為1。當信號量的值為0,則線程會阻塞一直等待信號量的值大于0為止,當值為0時,不在減少。參數說明:
sem參數是初始化時候創建的信號量結構體。4 線程信號量的銷毀函數sem_destroy
intsem_destroy(sem_t *sem);功能介紹:
函數用于釋放創建的信號量。
千鋒教育www.tmdps.cn
中國IT職業教育領先品牌
精品課程 全程面授
參數說明:
sem參數是初始化時候創建的信號量結構體。
使用線程的信號量進行通信,可以有效的對線程資源進行合理的分配,同時可以使線程以一個合理的方式進行調度。下面的代碼是一個小小的實例,用很常規的方法來使用信號量,當線程獲得獲得信號量之后,在處理完相應的操作之后會主動的釋放掉信號量。其實可以根據信號量的wait和post自己設計使用信號量。不過需要注意的是在wait和post函數分開使用時,可能會因為線程優先級等問題,post和wait被調用的次數不是對等的,這時候這時候可能出現的問題是不可控的,在這種方式設計程序時,需要把大部分的情況考慮進去,當然可能出現的情況的種數也是從0到1質變,從1到n量變得過程。
#include sem_tsem;7 intsemValue;8 void *pthread_wait(void *argv)10 { 11 while(1) 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 { 13 sem_wait(&sem);14 sem_getvalue(&sem, &semValue);15 printf(“This is in phtread WAIT function!sem = %dn”, semValue);16 sem_post(&sem);17 sleep(1);18 } 19 pthread_exit(“exit wait pthread!n”);20 } 21 void *pthread_post(void *argv)23 { 24 while(1)25 { 26 sem_wait(&sem);27 sem_getvalue(&sem, &semValue);28 printf(“This is in phtread POST function!sem = %dn”, semValue);29 sem_post(&sem);30 sleep(1);31 } 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 pthread_exit(“exit post pthread!”);33 } 34 intmain(void)36 { 37 pthread_tpt[2];38 void *ret;39 sem_init(&sem,0,2);41 pthread_create(&pt[0], NULL, &pthread_wait, NULL);42 pthread_create(&pt[1], NULL, &pthread_post, NULL);43 pthread_join(pt[0], &ret);44 printf(“return value %s”, ret);45 pthread_join(pt[1], &ret);46 printf(“return value %s”, ret);47 return 0;49 } 上面代碼的運行結果如下,因為是線程采用了無限循環的方式,所以pthread_exit和pthread_join不會執行到。 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 如果將上面代碼中的第26行注釋掉,運行結果如下,可以看到信號量的值一直在增加,就如上面提到的因為sem_wait函數和sem_post函數不能同時使用時,會出現一些不可控的運行結果。也可以利用這種情況,設計程序。 以上就是千鋒Linux學院的學習筆記。另附心得體會一篇: 從零基礎開始學Linux或者是轉行學習Linux,參加培訓會保證你在單位時間內學到更多,畢竟隨著Linux行業的快速發展,未來必將會面臨更多的競爭,所以只有不遺余力的把自己打造成一把利劍,從專業度到職業素質,只有比別人更突出和優秀,才能夠在這個相互選擇的世界當中擁有更多的選擇權利。現在想要學習Linux技術,只有通過參加培訓才可以保證快速掌握所學知識和技能,所 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 以培訓是比較靠譜的。 Linux編程培訓哪個好?千鋒教育的Linux課程專注于當前熱門的Linux相關技術,就Linux而言,內容全面而細致的。Linux教學團隊由眾多名師打造,擁有多年教學經驗和高超的Linux授課技巧和實戰視野,讓你理論和實戰兼得。 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 Linux網絡編程培訓哪個好 Linux下的網絡編程培訓哪個好?先來了解一下什么事Linux下的網絡編程吧! Linux下的網絡編程指的是socket套接字編程,入門比較簡單。在學校里學過一些皮毛,平時就是自學玩,沒有見識過真正的socket編程大程序,比較遺憾。總感覺每次看的時候都有收獲,但是每次看完了之后,過段時間不看,重新拾起這些知識的時候又要從頭開始,所以,在這里做個筆記也算是做個模板,以后可以直接從某一個階段開始接著玩…… socket套接字基本函數介紹 1 創建socket套接字 int socket(int family, int type, int protocol);功能介紹: 在Linux操作系統中,一切皆文件,這個大家都知道,個人理解創建socket的過程其實就是一個獲得文件描述符的過程,當然這個過程會是比較復雜的。可以從內核中找到創建socket的代碼,并且socket的創建和其他的listen,bind等操作分離開來。socket函數完成正確的操作是返回值大于0的文件描述符,當返回小于0的值時,操作錯誤。同樣是返回一個文件描述符,但是會因為三個參數組合不同,對于數據具體的工作流程不同,對于應用層編程來說,這些也是不可見的。參數說明: 從socket創建的函數可以看出,socket有三個參數,family代表一個協 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 議族,比較熟知的就是AF_INET,PF_PACKET等;第二個參數是協議類型,常見類型是SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_PACKET等;第三個參數是具體的協議,對于標準套接字來說,其值是0,對于原始套接字來說就是具體的協議值。2 地址端口綁定函數bind int bind(intsockfd, conststructsockaddr *myaddr, socklen_taddrlen);功能介紹: bind函數主要應用于服務器模式一端,其主要的功能是將addrlen長度 structsockaddr類型的myaddr地址與sockfd文件描述符綁定到一起,在sockaddr中主要包含服務器端的協議族類型,網絡地址和端口號等。在客戶端模式中不需要使用bind函數。當bind函數返回0時,為正確綁定,返回-1,則為綁定失敗。參數說明: bind函數的第一個參數sockfd是在創建socket套接字時返回的文件描述符。 bind函數的第二個參數是structsockaddr類型的數據結構,由于structsockaddr數據結構類型不方便設置,所以通常會通過對tructsockaddr_in進行地質結構設置,然后進行強制類型轉換成structsockaddr類型的數據,下面是兩種類型數據結構的定義和對應關系圖。 typedef unsigned short sa_family_t;structin_addr { __be32 s_addr; 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 }; structsockaddr { sa_family_tsa_family; /* address family, AF_xxx */ charsa_data[14]; /* 14 bytes of protocol address */ }; /* Structure describing an Internet(IP)socket address.*/ #define __SOCK_SIZE__ /* sizeof(structsockaddr) */ structsockaddr_in { sa_family_tsin_family; /* Address family */ __be16 sin_port; /* Port number */ structin_addrsin_addr; /* Internet address */ /* */ unsigned char __pad[__SOCK_SIZE__sizeof(unsigned short int)-sizeof(structin_addr)];}; 千鋒教育www.tmdps.cn Pad to size of `structsockaddr'.中國IT職業教育領先品牌 精品課程 全程面授 圖5 structsockaddr_in和structsockaddr的映射關系 bind函數的第三個參數是指定structsockaddr類型數據的長度,因為前面講過bind函數的第二個參數是通過設置一個較容易的數據結構,然后通過強制類型轉換成structsockaddr,實際上,第二個參數具體的數據結構的長度會根據socket創建時,設置的family協議族的不同而不同,像AF_UNIX協議族的bind函數第二個參數的數據結構應該是structsockaddr_un,其大小和structsockaddr_in不同。3 監聽本地端口listen int listen(intsockfd, int backlog);功能介紹: 剛開始理解listen函數會有一個誤區,就是認為其操作是在等在一個新的connect的到來,其實不是這樣的,真正等待connect的是accept操作,listen的操作就是當有較多的client發起connect時,server端不能及時的處理已經建立的連接,這時就會將connect連接放在等待隊列中緩存起來。這個等待隊列的長度有listen中的backlog參數來設定。listen和accept函數是服務器模 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 式特有的函數,客戶端不需要這個函數。當listen運行成功時,返回0;運行失敗時,返回值位-1.參數說明: sockfd是前面socket創建的文件描述符;backlog是指server端可以緩存連接的最大個數,也就是等待隊列的長度。4 接受網絡請求函數accept int accept(intsockfd, structsockaddr *client_addr, socklen_t *len);功能介紹: 接受函數accept其實并不是真正的接受,而是客戶端向服務器端監聽端口發起的連接。對于TCP來說,accept從阻塞狀態返回的時候,已經完成了三次握手的操作。Accept其實是取了一個已經處于connected狀態的連接,然后把對方的協議族,網絡地址以及端口都存在了client_addr中,返回一個用于操作的新的文件描述符,該文件描述符表示客戶端與服務器端的連接,通過對該文件描述符操作,可以向client端發送和接收數據。同時之前socket創建的sockfd,則繼續監聽有沒有新的連接到達本地端口。返回大于0的文件描述符則表示accept成功,否則失敗。參數說明: sockfd是socket創建的文件描述符;client_addr是本地服務器端的一個structsockaddr類型的變量,用于存放新連接的協議族,網絡地址以及端口號等;第三個參數len是第二個參數所指內容的長度,對于TCP來說其值可以用sizeof(structsockaddr_in)來計算大小,說要說明的是accept的第三個參數要是指針的形式,因為這個值是要傳給協議棧使用的。 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 連接目標服務器函數connect int connect(intsock_fd, structsockaddr *serv_addr,intaddrlen);功能介紹: 連接函數connect是屬于client端的操作函數,其目的是向服務器端發送連接請求,這也是從客戶端發起TCP三次握手請求的開始,服務器端的協議族,網絡地址以及端口都會填充到connect函數的serv_addr地址當中。當connect返回0時說明已經connect成功,返回值是-1時,表示connect失敗。參數說明: connect的第一個參數是socket創建的文件描述符;第二個參數是一個structsockaddr類型的指針,這個參數中設置的是要連接的目標服務器的協議族,網絡地址以及端口號;第三個參數表示第二個參數內容的大小,與accept不同,這個值不是一個指針。 在服務器端和客戶端建立連接之后是進行數據間的發送和接收,主要使用的接收函數是recv和read,發送函數是send和write。因為對于socket套接字來說,最終實際操作的是文件描述符,所以可以使用對文件進行操作的接收和發送函數對socket套接字進行操作。對于UDP編程來說,其服務器端和客戶端之間沒有三次握手建立連接,所以服務器端沒有listen和accept函數,客戶端沒有connect函數。所以對于服務器端來說,沒有accept函數,所以使用recvfrom函數來獲取數據的同時獲得客戶端的協議族,網絡地址以及端口號;對于客戶端來說,沒有connect函數,所以使用sendto函數發送數據的同時設置服務器端的協議族,網絡地址以及端口;同理如果recvfrom用在客戶端,則 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 是接收服務器端數據和地址,sendto用在服務器端,則是發送到客戶端網絡地址以及端口數據。6 接收數據函數recvfrom ssize_trecvfrom(intsockfd, void *buf, size_tlen, int flags, structsockaddr *from, socklen_t *fromlen);功能介紹: 對于該函數主要的功能是,從客戶端或者服務器端接收數據以及發送方的地址信息存儲到本地的structsockaddr類型參數變量當中,如果函數返回-1,所說明接收數據失敗,如果返回的是大于等于0的值,則說明函數接收到的數據的大小。因為可以設置文件描述符的狀態為阻塞模式,所以在沒有接收到數據時,recvfrom會一直處于阻塞狀態,直到有數據接收到。參數說明: sockfd是創建socket時的文件描述符;buf用于存儲接收到的數據緩沖區,接收的數據將放到這個指針所指向的內容的空間中;len是接收緩沖區的大小;from是指向structsockaddr的指針,接收發送方地址信息;fromlen是表示第5個參數所指向內容的長度,可以使用sizeof(structsockaddr)來定義大小,不過因為是要傳給內核協議棧,所以使用了指針類型。7 發送數據函數sendto sizeof_tsendto(intsockfd, const void *buf, size_tlen, int flag, conststructsockaddr *to, socklen_ttolen);功能介紹: sendto函數主要根據填充的接收方的地址信息向客戶端或者服務器端發 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 送數據,接收方的地址信息會提前設置在structsockaddr類型的參數指針中,當返回值-1時,表明發送失敗,當返回值大于等于0時,表示發送成功,并且發送數據的大小會通過返回值傳遞回來。參數說明: sockfd是有socket創建的文件描述符;buf是發送數據緩沖區,要發送的數據會放在這個指針指向的內容空間中;len是發送緩沖區的大小;to是一個structsockaddr類型的指針,其指向地址的內容是接收方地址信息;tolen表示第5個參數指向的數據內容的長度,傳遞的是值,可以用sizeof(structsockaddr)計算。 以上就是千鋒Linux學院的學習筆記。另附心得體會一篇: 從零基礎開始學Linux或者是轉行學習Linux,參加培訓會保證你在單位時間內學到更多,畢竟隨著Linux行業的快速發展,未來必將會面臨更多的競爭,所以只有不遺余力的把自己打造成一把利劍,從專業度到職業素質,只有比別人更突出和優秀,才能夠在這個相互選擇的世界當中擁有更多的選擇權利。現在想要學習Linux技術,只有通過參加培訓才可以保證快速掌握所學知識和技能,所以培訓是比較靠譜的。 Linux下的網絡編程培訓哪個好?千鋒教育的Linux課程專注于當前熱門的Linux相關技術,就Linux而言,內容全面而細致的。Linux教學團隊由眾多名師打造,擁有多年教學經驗和高超的Linux授課技巧和實戰視野,讓你理論和實戰兼得。 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 學習Linux編程哪個好 想知道Linux編程培訓哪家好?先來了解一下什么是Linux編程吧!Linux下的網絡編程指的是socket套接字編程,入門比較簡單。在學校里學過一些皮毛,平時就是自學玩,沒有見識過真正的socket編程大程序,比較遺憾。總感覺每次看的時候都有收獲,但是每次看完了之后,過段時間不看,重新拾起這些知識的時候又要從頭開始,所以,在這里做個筆記也算是做個模板,以后可以直接從某一個階段開始接著玩…… IO復用之select函數 select函數用于IO復用,它用于監視多個文件描述符集合,看規定時間內有沒有事件產生。 int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);功能介紹: 該函數主要的功能是對需要操作的文件描述符集合進行查詢,目標文件描述符中有可以讀,寫或者異常錯誤操作的情況時,會返回一個大于0的整數值,表示可以對該文件描述符進行操作。select函數返回0,表示超時;返回-1,表示發生錯誤;返回大于0的整數值,表示有符合要求的文件描述事件產生。當不需要監視某種文件描述符時,設置參數為NULL。參數說明: nfds:是一個整型變量,其值是加入到后面三個文件描述符集合中的最大文件描 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 述符的值加1。 readfds:可讀文件描述符集合,通過FD_SET向該文件描述符集合中加入需要監視的目標文件描述符,當有符合要求的文件描述符時,select會返回一個大于0的值,同時會把原來集合中的不可讀的文件描述符清掉,如果想在次監視可讀文件描述,需要重新FD_SET。 writefds:可寫文件描述符集合,同樣通過FD_SET函數向結合中加入需要被監視的目標文件描述符,select返回時,同樣會把不可寫文件描述符清掉,如果需要重新監視文件描述符,需要重新FD_SET設置。 exceptfds:該描述符集合是用于監視文件描述符集合中的任何文件是否發生錯誤。 timeout:用于設置超時的最長等待時間,如果在該規定時間內沒有返回一個大于0的值,則返回0,表示超時。如果超時間設置為NULL,表示阻塞等待,直到符合條件的文件描述符在集合中出現,當timeout的值為0時,select會立即返回。 timeout的數據結構如下: struct timeval { time_t tv_sec; /*秒*/ long tv_usec; /*微秒*/ };有4個宏可以操作文件描述符集合: FD_ZERO: 用于清空文件描述符集合,FD_ZERO(&fds)。 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 FD_SET:向某個文件描述符結合中加入文件描述符, FD_SET(fd, &fds)。FD_CLR:從某個文件描述符結合中取出某個文件描述符, FD_CLR(fd, &fds)。FD_ISSET:測試某個文件描述符是否在某個文件描述符集合中, FD_ISSET(fd, &fds)。 下面是本實用socket編程,并且利用select IO實現的一個server和client實時通信的例子,為了顯示更直觀,加了一些打印以及接收數據上的操作,程序還有bug,希望閱讀的人不要介意,或者自行修改。代碼如下,可以作為學習socket和select的一個實例。server.c文件源碼如下: #include int main(void)13 { 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 int sockfd, clientfd; struct sockaddr_in sockServer, sockClient;16 struct timeval tv;17 fd_set readfds, writefds;18 int readlen, writelen;19 char buffer[SIZE];20 sockfd = socket(AF_INET, SOCK_STREAM, 0);22 if(sockfd < 0)23 { 24 perror(“create socket failed!n”);25 return-1;26 } 27 bzero(&sockServer, 0);29 sockServer.sin_family = AF_INET;30 sockServer.sin_port = htons(SPORT);31 sockServer.sin_addr.s_addr = htonl(INADDR_ANY);32 if(bind(sockfd,(struct sockaddr *)&sockServer, sizeof(struct sockaddr_in))< 0)34 { 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 perror(“bind socket failed!n”);36 return-1;37 } 38 if(listen(sockfd, BACKLOG)< 0)40 { 41 perror(“listen failed!n”);42 } 43 printf(“Server is listening......n”);45 while(1)47 { 48 int len = sizeof(struct sockaddr_in);49 int ret;50 time_t timet;51 clientfd = accept(sockfd,(struct sockaddr *)&sockClient, &len);53 if(clientfd < 0)54 { 55 perror(“accept failed!n”); 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 return-1;57 } 58 for(;;)60 { 61 FD_ZERO(&readfds);FD_SET(1, &readfds);FD_SET(clientfd, &readfds);tv.tv_usec = 0;tv.tv_sec = 60; ret = select(clientfd+1, &readfds, NULL, NULL, &tv);switch(ret){ case 0: printf(“select timeout!n”); break; case-1: perror(“select return failed!n”); goto closesocket; default: if(FD_ISSET(clientfd, &readfds)> 0) 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 { 79 memset(buffer, 0, SIZE);80 readlen = read(clientfd, buffer, SIZE);81 if(readlen < 0)82 { 83 ctime(&timet));88 perror(“read data failed!n”); goto closesocket; } time(&timet); printf(“Opposite: %d %s”, clientfd,strcat(buffer, “n”); writelen = write(0, buffer, readlen+1); if(writelen < 0) { perror(“write data failed!n”); goto closesocket; } } if(FD_ISSET(1, &readfds)> 0){ time(&timet); 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 printf(“Owner: %d %sn”, sockfd, ctime(&timet));100 memset(buffer, 0, SIZE);101 readlen = read(1, buffer, SIZE);102 if(readlen < 0)103 112 113 } 114 } 115 } 116 closesocket: 117 close(clientfd);118 } 119 close(sockfd); { perror(“read data failed!n”); goto closesocket;} writelen = write(clientfd, buffer, readlen);if(writelen < 0){ perror(“write data failed!n”); goto closesocket;} 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 120 121 return 0;122 } client.c文件源碼如下: #include int main(void)12 { 13 int sockfd, clientfd; struct sockaddr_in sockServer;15 struct timeval tv;16 fd_set readfds;17 int readlen, writelen; 精品課程 全程面授 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 char buffer[SIZE];19 time_t timet;20 sockfd = socket(AF_INET, SOCK_STREAM, 0);22 if(sockfd < 0)23 { 24 perror(“create socket failed!n”);25 return-1;26 } 27 bzero(&sockServer, 0);29 sockServer.sin_family = AF_INET;30 sockServer.sin_port = htons(SPORT);31 sockServer.sin_addr.s_addr = htonl(INADDR_ANY);32 if(connect(sockfd,(struct sockaddr *)&sockServer, sizeof(struct sockaddr_in))< 0)34 { 35 perror(“connect failed!n”);36 close(sockfd);37 } 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 while(1)40 { 41 int ret;42 FD_ZERO(&readfds);44 FD_SET(1, &readfds);45 FD_SET(sockfd, &readfds);46 tv.tv_usec = 0;47 tv.tv_sec = 60;48 ret = select(sockfd+1, &readfds, NULL, NULL, &tv);50 switch(ret)51 { 52 case 0: 53 printf(“select timeout!n”);54 break;55 case-1: 56 perror(“select return failed!n”);57 goto closesocket;58 default: 59 if(FD_ISSET(sockfd, &readfds)> 0)60 { 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 memset(buffer, 0, SIZE);62 readlen = read(sockfd, buffer, SIZE);63 if(readlen < 0)64 { 65 perror(“read data failed!n”);66 ctime(&timet));70 goto closesocket; } time(&timet); printf(“Opposite: %s %s”, “Server”,strcat(buffer, “n”); writelen = write(0, buffer, readlen + 1); if(writelen < 0) { perror(“write data failed!n”); goto closesocket; } } if(FD_ISSET(1, &readfds)> 0){ time(&timet); printf(“Owner: %d %sn”, sockfd,千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 ctime(&timet));82 memset(buffer, 0, SIZE);83 readlen = read(1, buffer, SIZE);84 if(readlen < 0)85 { 86 perror(“read data failed!n”);87 goto closesocket;88 } 89 writelen = write(sockfd, buffer, readlen);90 if(writelen < 0)91 { 92 perror(“write data failed!n”);93 goto closesocket;94 } 95 } 96 } 97 closesocket: 99 close(clientfd);100 } 101 close(sockfd);102 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 return 0;104 } 運行結果如下所示: 以上就是千鋒Linux學院的學習筆記。另附心得體會一篇: 從零基礎開始學Linux或者是轉行學習Linux,參加培訓會保證你在單位時間內學到更多,畢竟隨著Linux行業的快速發展,未來必將會面臨更多的競爭,所以只有不遺余力的把自己打造成一把利劍,從專業度到職業素質,只有比別人更突出和優秀,才能夠在這個相互選擇的世界當中擁有更多的選擇權利。現在想要學習Linux技術,只有通過參加培訓才可以保證快速掌握所學知識和技能,所以培訓是比較靠譜的。 學習Linux編程哪個好?千鋒教育的Linux課程專注于當前熱門的Linux相關技術,就Linux而言,內容全面而細致的。Linux教學團隊由眾多名師打造,擁有多年教學經驗和高超的Linux授課技巧和實戰視野,讓你理論和實戰兼得。 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 千鋒教育www.tmdps.cn 英語口語培訓機構哪個好及外教費用 外教公司哪家好? 外教公司可分為為學校公司服務的以及為個人服務的外教公司。有些學校在把英語外教課程外包給某家外教公司的越來越多,這樣學習省去了招聘外教,辦理手續等繁雜的工作,而且教學的專業化程度會更高一些,但是北京市場上由于各方面的原因沒有幾家資深為學習服務的外教公司。 為個人服務的外教公司已經和英語培訓公司非常的接近,只是不提供硬性的教學設施例如教室。但是如果可以在家里或公共地點上課的同學來說是個非常不錯的選擇。不僅降低了學費的成本,而且能節省很多的上課路上奔波的時間。北京市場上提高此類服務的公司比較典型的是速恩英語,對教師資質要求比較高而且課時費可以按次結算。 外教價格/外教費用是多少? 是和很多因素相關的,例如外教老師的資質,外教上課的地點:外教上門和在公共地點上課費是不一樣的,外教上課的時間,外教上課的頻率,外教的教學內容,例如日常口語相對容易,但是雅思托福、SAT,商務英語等專業的課程外教老師的備課時間會更多,所以收費也會有所增長,如果需要詳細了解可以電話咨詢 中國IT職業教育領先品牌 精品課程 全程面授 Linux編程培訓哪家好 想知道Linux編程培訓哪家好?先來了解一下什么是Linux編程吧!Linux下的網絡編程指的是socket套接字編程,入門比較簡單。在學校里學過一些皮毛,平時就是自學玩,沒有見識過真正的socket編程大程序,比較遺憾。總感覺每次看的時候都有收獲,但是每次看完了之后,過段時間不看,重新拾起這些知識的時候又要從頭開始,所以,在這里做個筆記也算是做個模板,以后可以直接從某一個階段開始接著玩…… Linux線程介紹 通過socket機制建立起的連接,僅僅實現的是服務器端和客戶端之間的通信,數據的傳輸。但是要使網絡編程實現性能更優的話,少不了使用線程,線程間通信以及IO函數,接下來就簡單講一下線程,線程間通信,以及IO函數中的select函數。 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 Linux下的線程,線程是進程中的一個運行單元,進程fork子進程的過程是對父進程進程copy的過程,然后緊緊改變子進程本身的一些變量,之后各自的進程運行屬于自己進程空間的內容;而線程的創建則不然,線程創建在進程中有自己固定的創建函數,在同一個進程中創建的所有線程會共用所在進程的全局變量,信號句柄,文件描述符和當前的目錄狀態,但是每個線程又會有屬于自己的線程棧等私有的屬性。進程獲得的使用資源被分給了每個線程,除公共部分外每個線程之間的運行又是相對獨立的。Linux下線程的基本函數: 1 線程創建函數pthread_create intpthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);功能介紹: 該函數是用于在進程中創建線程,線程在進程中創建有固定的形式。個人理解,線程的創建就是圈起了一段代碼作為一個線程,這段被圈起來的函數作為線程函數,線程開始運行就是從線程函數開始運行,線程函數也有固定的格式,因為格式固定,線程的創建把單獨作為參數的線程函數和線程函數參數整合到一起,形成一個線程。當然在創建的同時,會設置當前線程的屬性,以及用于操作的線程標識符。參數說明: thread:第一個參數是一個pthread_t類型的線程標識符,可以通過操作該標識符,實現對線程的操作; attr:第二個參數是用來設置線程的屬性,包括線程優先級等屬性; 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 start_routine:第三個參數是指當線程成功創建后,開始運行的一個單元,該單元需要自己編寫,一般會使用無限循環來實現; arg:第四個參數是第三個參數線程函數運行時傳入的參數,為了防止每個線程函數輸入參數不同而難以操作,所以線程創建講兩者分開,這樣更靈活,便于操作。線程結束函數pthread_join和pthread_exit 2.1 線程函數結束pthread_exit void pthread_exit(void *retval);功能介紹: 該函數主要的功能是從被圈起來的線程函數中退出,退出過程中會通過函數的參數指針帶出一個對象,當等待線程結束函數pthread_join的第二個參數不是NULL時,會傳給這個參數做相應的處理。參數說明: 函數的參數是一個指針,通過該指針可以傳遞出當前進程結束時的相關信息,這個值會被pthread_join捕捉到。2.2 等待線程結束pthread_join int pthread_join(pthread_t th,void **return_value);功能介紹: 函數主要功能是等待線程結束,pthread_exit是主動結束線程,該函數是被動等待線程結束。函數會處于等待狀態,如果函數的第二個參數沒有設置為NULL,則會捕捉到從exit傳遞回的信息。參數說明: 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 第一個參數是要等待的線程的標識符,有phread_create函數第一個參數指定其值是多少;第二個參數是一個二維指針,用于等待從pthread_exit返回值。當然,如果不適用pthread_exit結束線程函數的話,線程函數結束,也就是調用函數的線程結束。當線程函數運行結束時,該函數用于回收線程的資源。 對于講理論來說,大家往往更喜歡實例,下面是一個線程的小例子。 #include pthread_tpth[2];6 void *print_message(void *argv)8 { 9 printf(“This is in thread %x!n”, *((pthread_t *)argv));10 if(&pth[0] == argv)12 { 13 sleep(1);14 pthread_exit(“1 thread exit!”);15 } 16 else 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 { 18 sleep(10);19 pthread_exit(“2 thread exit!”);20 } 21 } 22 intmain(void)24 { 25 void *returnValue;26 printf(“This is in main function BEFORE pthread create!n”);28 pthread_create(&pth[0], NULL, &print_message, &pth[0]);29 pthread_create(&pth[1], NULL, &print_message, &pth[1]);30 printf(“This is in main function AFTER pthread create %x!n”, pth[0]);31 pthread_join(pth[0], &returnValue);32 printf(“This is in main function AFTER pthread join 1n”);33 pthread_join(pth[1], &returnValue);34 printf(“This is in main function returnValue=%sn”, returnValue);35 printf(“This is in main function AFTER pthread joinn”);36 return 0;37 } 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 下面是運行結果: 這個只是運行結果,其實一些動態的東西,也看不到,因為pthread_join是阻塞等待線程結束的,所以說這個代碼是線程1等待一秒首先結束線程運行,pthread_join會捕捉到線程結束,線程2會在線程1結束運行后約9s然后結束運行,這時候線程2的pthread_join才會捕捉到線程結束并釋放資源。所以如果是使用多線程并且在同一個地方統一使用pthread_join釋放資源時,最好先釋放首先結束運行的線程,然后在釋放后結束的線程。否則的話如果使用pthread_join先釋放后結束運行的線程,先結束運行的線程資源因為等待前面pthread_join結束而得不到釋放。 因為線程是在進程中創建的,線程公用進程中的資源,所以線程資源的釋放非常重要。主要的線程資源釋放的方法有下面三種: 1)在線程函數中調用pthread_detach(pthread_self()),主動釋放線程資源; 2)向上面介紹的pthread_join函數,被動釋放線程資源; 3)通過設置線程屬性中的__detachstate屬性,在線程函數運行完,或者pthread_exit退出時,自動釋放線程資源,設置線程屬性通過下面方式,pthread_attr_tatt;//線程屬性 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 pthread_attr_init(&att);//初始化線程屬性 pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED);//設置線程屬性 pthread_create(pthread_t *pthread, &att, void *(*thread_function)(void *),(void *argv));//建立線程 3 線程的屬性 線程創建函數pthread_create的第二個參數是指線程的屬性,當該參數設置為NULL時,表示使用了線程的默認屬性。其實我們可以通過設置第二個參數來設置線程的屬性。線程屬性的改變有屬于自己的結構體和函數。線程屬性的結構體 typedefstruct __pthread_attr_s { int __detachstate; /*線程的終止狀態*/ int __schedpolicy; /*調度優先級*/ int __sched_param __shedparam; /*參數*/ int __inheritsched; /*繼承*/ int __scope; /*范圍*/ int __guardsize; /*保證尺 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 寸*/ int __stackaddr_set /*運行棧*/ void *__stackaddr; /*線程運行棧地址*/ size_t __stacksize; /*線程運行棧大小*/ }pthread_attr_t; 線程主要的屬性對象包括上面提到的這幾種,線程的屬性不可以直接設置,需要通過特定的函數來實現,可以通過函數對上面這幾種線程屬性進行修改。并且線程屬性的修改要在創建線程之前完成。線程屬性的初始化函數為pthread_attr_init,通過如下所示的函數可以說明線程的屬性參數都可以做修改,需要再次強調的是這些參數的修改需要在創建線程之前完成,將修改后的屬性參數通過pthead_create的第二個參數傳入到線程中,具體函數如下:(具體如何使用可參考http://blog.csdn.net/hudashi/article/details/7709413)1).線程優先級設置屬性,需要先獲得線程當前屬性優先級,然后通過設置操作修改屬性優先級 intpthread_attr_getschedparam(pthread_attr_t* attr, structsched_param* param);intpthread_attr_setschedparam(pthread_attr_t* attr, structsched_param* param); 千鋒教育www.tmdps.cn 中國IT職業教育領先品牌 精品課程 全程面授 2).設置線程范圍屬性 intpthread_attr_setscope(pthread_attr_t* attr, int scope);3).設置線程終止狀態屬性 intpthread_attr_setdetachstate(pthread_attr_t* attr, intdetachstate);4).設置線程保護區大小屬性 intpthread_attr_setguardsize(pthread_attr_t* attr,size_tguardsize);5).設置線程繼承調度屬性 intpthread_attr_setinheritsched(pthread_attr_t* attr, intinheritsched);6).設置線程棧基址以及堆棧的最小尺寸大小 intpthread_attr_setstack(pthread_attr_t* stackader,size_tstacksize);7).設置線程棧基址屬性 intpthread_attr_setstackaddr(pthread_attr_t* attr, void* stackader);8).設置線程棧的大小屬性 intpthread_attr_setstacksize(pthread_attr_t* attr, size_tstacksize); 以上就是千鋒Linux學院的學習筆記。另附心得體會一篇: 從零基礎開始學Linux或者是轉行學習Linux,參加培訓會保證你在單位時間內學到更多,畢竟隨著Linux行業的快速發展,未來必將會面臨更多的競爭,所以只有不遺余力的把自己打造成一把利劍,從專業度到職業素質,只有比別人更突出和優秀,才能夠在這個相互選擇的世界當中擁有更多的選擇權利。現在想 千鋒教育www.tmdps.cn attr, void* 中國IT職業教育領先品牌 精品課程 全程面授 要學習Linux技術,只有通過參加培訓才可以保證快速掌握所學知識和技能,所以培訓是比較靠譜的。 Linux編程培訓哪家好?千鋒教育的Linux課程專注于當前熱門的Linux相關技術,就Linux而言,內容全面而細致的。Linux教學團隊由眾多名師打造,擁有多年教學經驗和高超的Linux授課技巧和實戰視野,讓你理論和實戰兼得。 千鋒教育www.tmdps.cn第二篇:Linux網絡編程培訓哪個好專題
第三篇:學習Linux編程哪個好
第四篇:英語口語培訓機構哪個好
第五篇:Linux編程培訓哪家好