Linux学习笔记(四):信息量、同步、互斥和网络编程

接上:
Linux学习笔记(一)
Linux学习笔记(二)
Linux学习笔记(三):函数、文件IO和线程

目录

  • 复习
    • 结构体:struct
    • 文件I/O:
    • 线程:
  • 主要学习内容
    • 信号量
    • 同步:按照一定的顺序有序的执行
    • 互斥:抢资源;谁先抢到资源就谁先执行
    • 网络编程:
      • 服务器:server
      • 客户端:client
  • 代码及演示
  • 收获及感悟

复习

结构体:struct

Linux学习笔记(四):信息量、同步、互斥和网络编程_第1张图片

文件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操作

Linux学习笔记(四):信息量、同步、互斥和网络编程_第2张图片
Linux学习笔记(四):信息量、同步、互斥和网络编程_第3张图片

同步:按照一定的顺序有序的执行

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
#include
#include
#include

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
#include
#include
#include 

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操作及注意事项、互斥下的解锁和加锁、网络编程的部分内容,今天学习的内容以前都是没有接触的,所以有一种新鲜感。

你可能感兴趣的:(Linux)