接上:
Linux學習筆記(一)
Linux學習筆記(二)
Linux學習筆記(三):函數、文件IO和線程
目錄
複習
結構體:struct
文件I/O:
int open(char *pathname,int flag);
eg:int fd = open(“1.txt”,O_RDWR);//打開文件
if(){
error;
}success;
int rte = read(fd,buf,sizeof(buf));//讀取文件
if(rte < 0){
Error;
}success;
int ret = write(fd,buf,ret);//寫文件
lseek(fd,0,SEEK_SET);//定位
close(fd);//關閉文件
線程:
void *fun(char *x){
printf(“hello\n”);
return “hello”;
}//子線程
pthread_create(thread,NULL,fun,”hello”);
void *buf;
pthread_join(thread,&buf);
主要學習內容
信號量
//(線程間同步—P/V操作)先V(釋放資源)和P(申請資源)
int sem_init(sem_t *sem,int pshared,unsigned int value);
int sem_wait(sem_t *sem);//P操作
int sem_post(sem_t *sem);//V操作
同步:按照一定的順序有序的執行
sem_init(&sem,0,0);
sem_post(&sem); //V操作 釋放資源 信號量加1
sem_wait(&sem); //P操作 申請資源 信號量減1
互斥:搶資源;誰先搶到資源就誰先執行
互斥鎖:
加鎖:pthread_mutex_lock(&mutex);
解鎖:pthread_mutex_unlock(&mutex);
網絡編程:
服務器:server
//建立連接
socket( );//創建套接字
聲明:int socket(int domain, int type,int protocol)
bind( );//綁定自己的IP
聲明:int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
sockfd:是由socket調用返回的文件描述符.
addrlen:是sockaddr結構的長度.
my_addr:是一個指向sockaddr的指針. 在中有 sockaddr的定義
listen( );//監聽是否有客戶端向服務器發起連接
聲明:int listen(int sockfd,int backlog)
sockfd:是bind後的文件描述符.
backlog:設置請求排隊的最大長度.當有多個客戶端程序和服務端相連 時, 使用這個表示可以介紹的排隊長度.
listen函數將bind的文件描述符變爲監聽套接字.返回的情況和bind一樣.
accept( );//接受客戶端的請求
聲明:int accept(int sockfd, struct sockaddr *addr,int *addrlen)
sockfd:是listen後的文件描述符.
addr,addrlen是用來給客戶端的程序填寫的,服務器端只要傳遞指針就可了. bind,listen和accept是服務器端用的函數, accept調用時,服務器端的程序會一直阻塞到有一個 客戶程序發出了連接. accept成功時返回最後的服務器端的文件描述符, 這個時候服務器端可以向該描述符寫信息了. 失敗時返回-1。
//接收數據
write( );//send( );
read( );//recv( );
//關閉
close( );
客戶端:client
//建立連接
socket( );
connect( );//主動發起與服務器的連接
聲明:int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)
sockfd:socket返回的文件描述符.
serv_addr:儲存了服務器端的連接信息.其中sin_add是服務端的地址
addrlen:serv_addr的長度
connect函數是客戶端用來同服務端連接的.成功時返回0,sockfd是同服務端通訊的文件描述符 失敗時返回-1.
//接收數據
read( );//recv();
write( );//send();
//關閉
close( );
代碼及演示
加鎖和解鎖:
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<semaphore.h>
pthread_mutex_t mutex;
pthread_t thread;
void *fun(){
while(1){
pthread_mutex_lock(&mutex);
sleep(0);
printf("wyj\n");
pthread_mutex_unlock(&mutex);
}
return "welcome";
}
int main(){
pthread_mutex_init(&mutex,NULL);
pthread_create(&thread,NULL,fun,NULL);
while(1){
pthread_mutex_lock(&mutex);
sleep(0);
printf("你好\n");
pthread_mutex_unlock(&mutex);
}
void *buf;
pthread_join(thread,&buf);
printf("%s\n",(char*)buf);
return 0;
}
網絡編程:
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <arpa/inet.h>
int main(){
/*1.創建套接字*/
int sock = socket(PF_INET,SOCK_STREAM,0);
if(sock < 0){
printf("socket error\n");
return -1;
}
printf("socket success\n");
/*2.綁定本地IP*/
struct sockaddr_in myaddr;
myaddr.sin_family = PF_INET;
myaddr.sin_port = htons(8888);
myaddr.sin_addr.s_addr = inet_addr("192.168.13.119");
if(0 > bind(sock,(struct sockaddr*)(&myaddr),sizeof(myaddr))){
printf("bind error\n");
return -1;
}
printf("bind success\n");
/*3.監聽*/
if(0 > listen(sock,10)){
printf("listen reeor\n");
return -1;
}
printf("listen success\n");
/*4.接受鏈接請求*/
accept(sock,);
/*5.數據收發*/
//send()/recv();
/*6.關閉套接字*/
//close();
return 0;
}
收穫及感悟
在複習昨天學習的知識後,今天主要學習了信息量、同步、互斥和網絡編程,其中主要介紹了同步下的P操作和V操作及注意事項、互斥下的解鎖和加鎖、網絡編程的部分內容,今天學習的內容以前都是沒有接觸的,所以有一種新鮮感。