定义信号集 sigemptyset sigaddset |
设置信号屏蔽位 sigprocmask |
定义信号处理函数 if (sigismember(…)) {sa_mask; sa_handler; Sigaction} |
测试信号 sigpending |
shmget(key_t key, int size, int shmflag)创建共享内存 shmat(int shmid, void* shmaddr, int shmflg) 映射共享内存,shmflgl默认0可读写。 shmdt(const * shmaddr) 撤消共享内存 例: shmid=shmget(IPC_PRIVATE, BUFSIZE, 0666) shmaddr=shmat(shmid, 0, 0) <------使用共享内存,如何用,待学习补充 shmdt(shmaddr) 消息队列: 创建消息队列:qid = msgget(key, IPC_CREAT|0666) 添加消息到消息队列:msgsend(qid, &msg, BUFSIZE, 0,0) 从系统中移走消息队列:msgctl(qid, IPC_RMID,NULL) 第九章 多线程编程 gcc 编译时加上-pthread参数。 创建线程的过程: 1. 先定义线程函数 *start_routine 2. ret = pthread_create((pthread_t *thread_id, pthread_attr_t *attr, void* (*start_routine),void* arg)创建一个线程,其中start_routine是线程函数的起始地址。 3. pthread_join(thread_id, retvalue) 线程的分离属性: 用于决定线程以什么样的方式终止自己,而不需要pthread_join()才释放占有的资源。 带来的问题是,如果该线程很快,则它可能在pthread_create返回之前便终止了,终止后的线程号可能被其它线程所用,导致pthread_create得到错误的线程号。所用到的函数及步骤为: 1) 初始化线程pthread_attr_init(&attr) 2) 设置线程绑定属性pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM)。 3) 设置线程分离属性pthread_attr_setdetachstate(&attr, PTHREAD_CREATE,_DETATCHED); 4) pthread_create(…)创建线程 mutex互斥线程控制 互斥锁分为三种:快速(等待线程阻塞直至拥有的线程解锁),检错(快速锁的非阻塞版本),递归(返回,增加加锁的次数)。 互斥锁初始化pthread_mutex_init(&mutex,NULL) 线程一互斥锁上锁 pthread_mutex_lock(&mutex) 线程二测试线程是否上锁pthread_mutex_trylock(&mutex) 得到线程锁者解除线程锁pthread_mutex_unlock(&mutex) 信号量互斥控制(只需一个信号量): sem_t sem; sem_init(&sem, 0, 1) //(信号量,pshare, 信号量初值) sem_wait(&sem) //信号量获取,相当于P操作 sem_post(&sem) //信号量加一,唤醒等待进程。 其它函数 sem_getvalue取得值,sem_destroy删除 信号量同步(两个信号量sem1,sem2)程序如下: 信号量初始化 sem_init(&sem1, 0, 1) //sem1设为1, sem_init(&sem2,0,0) //sem2 设为0 thread1: sem_wait(&sem1); sem_post(&sem2); thread2: sem_wait(&sem2); sem_wait(&sem1); 这样,thread1线程首先获取sem1后,再post sem2唤醒thread2以达到同步。 第十章 嵌入式Linux网络编程 socket 基础编程 1. server: 1)建立socket连接sockfd= socket(AF_INET, SOCK_STREAM, 0),其中AF_INET 表示IPV4,SOCK_STREAM表示字节流套接字。 2)设置sockaddr_in结构体中的相关参数, 其中有port设置。 3)绑定本地IP地址绑定端口号(此端口供connect)。bind(sockfd, (struct sockaddr*)&server_sockaddr, sizeof(sockaddr) 4)侦听listen(sockfd, BACKLOG) BACKLOG是请求队列中最大请求数,默认20。 5)调用accept户端的连接。client_fd = accept(sockfd, (struct sockaddr *) &client_sockaddr, &sin_size) 6) recv接收数据。 7)关闭sockfd 2.客户端步骤基本同服务器,不同之处是后没有listen,且connect取代accept, send代recv 在高级网络编程中可以用fcntl设置sever非阻塞侦听,使用select函数解决循环测试CPU占用资源大的问题。