Linux學習筆記(四):信息量、同步、互斥和網絡編程

接上:
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操作及注意事項、互斥下的解鎖和加鎖、網絡編程的部分內容,今天學習的內容以前都是沒有接觸的,所以有一種新鮮感。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章