接上:
Linux学习笔记(一)
Linux学习笔记(二)
Linux学习笔记(三):函数、文件IO和线程
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
#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 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操作及注意事项、互斥下的解锁和加锁、网络编程的部分内容,今天学习的内容以前都是没有接触的,所以有一种新鲜感。