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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左手の明天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值