随笔分类 -  linux C语言编程

摘要:代码如下:#include <linux/module.h> #include <linux/fs.h> #include <linux/mm.h> #include <linux/init.h> #include <linux/cdev.h> #include <linux/slab.h> #in 阅读全文
posted @ 2020-02-24 20:46 red_leaf_412 阅读(1574) 评论(0) 推荐(0) 编辑
摘要:前面的队列以及锁都是基于阻塞是的操作。要实现同步,还可以通过信号也就是异步的方式来进行。例如在往文件的写入字符后,发送一个信号。捕捉到信号后执行动作。这样就不会造成阻塞,之前的阻塞性IO和POLL,是调用函数进去检查,条件不满足是造成阻塞。 应用层启动异步通知机制就三个步骤: 1 调用signal函 阅读全文
posted @ 2020-02-09 10:08 red_leaf_412 阅读(464) 评论(0) 推荐(0) 编辑
摘要:在Linux 驱动程序中,可以使用等待队列来实现阻塞进程的唤醒。等待队列的头部定义如下,是一个双向列表。 struct list_head { struct list_head *next, *prev; }; struct __wait_queue_head { spinlock_t lock; 阅读全文
posted @ 2019-11-18 19:34 red_leaf_412 阅读(366) 评论(0) 推荐(0) 编辑
摘要:首先是内核初始化函数。代码如下。主要是三个步骤。1 生成设备号。 2 注册设备号。3 创建设备。 #include <linux/module.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/cdev.h> #incl 阅读全文
posted @ 2019-11-05 19:06 red_leaf_412 阅读(2196) 评论(0) 推荐(0) 编辑
摘要:Posix共享内存区:共享内存是最快的可用IPC形式。它允许多个不相关(无亲缘关系)的进程去访问同一部分逻辑内存。如果需要在两个进程之间传输数据,共享内存将是一种效率极高的解决方案。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传输就不再涉及内核。这样就可以减少系统调用时间,提高程序 阅读全文
posted @ 2019-05-11 15:35 red_leaf_412 阅读(366) 评论(0) 推荐(0) 编辑
摘要:POSIX信号量接口,意在解决XSI信号量接口的几个不足之处: POSIX信号量接口相比于XSI信号量接口,允许更高性能的实现。 POSIX信号量接口简单易用:没有信号量集,其中一些接口模仿了我们熟悉的文件系统操作。 POSIX信号量删除时的处理更加合理。XSI信号量被删除后,使用该信号量标识符的操 阅读全文
posted @ 2019-04-06 15:52 red_leaf_412 阅读(1114) 评论(0) 推荐(0) 编辑
摘要:记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作。尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记录上锁往往更容易使用,且效率更高。记录锁的功能:当一个进程正在读或修改文件的某个部分是,它可以阻止其 阅读全文
posted @ 2019-03-31 15:19 red_leaf_412 阅读(659) 评论(0) 推荐(0) 编辑
摘要:什么是读写锁读写锁其实还是一种锁,是给一段临界区代码加锁,但是此加锁是在进行写操作的时候才会互斥,而在进行读的时候是可以共享的进行访问临界区的 为什么需要读写锁有时候,在多线程中,有一些公共数据修改的机会比较少,而读的机会却是非常多的,此公共数据的操作基本都是读,如果每次操作都给此段代码加锁,太浪费 阅读全文
posted @ 2019-03-03 20:23 red_leaf_412 阅读(2622) 评论(0) 推荐(0) 编辑
摘要:条件变量:等待与信号发送 使用互斥锁虽然可以解决一些资源竞争的问题,但互斥锁只有两种状态(加锁和解锁),这限制了互斥锁的用途。 条件变量(条件锁)也可以解决线程同步和共享资源访问的问题,条件变量是对互斥锁的补充,它允许一个线程阻塞并等待另一个线程发送的信号,当收到信号时,阻塞的线程被唤醒并试图锁定与 阅读全文
posted @ 2019-02-24 15:17 red_leaf_412 阅读(2162) 评论(0) 推荐(0) 编辑
摘要:们常说互斥锁保护临界区,实际上是说保护临界区中被多个线程或进程共享的数据。互斥锁保证任何时刻只有一个线程在执行其中的代码。 互斥锁具有以下特点: ·原子性:把一个互斥锁定义为一个原子操作,这意味着操作系统保证了如果一个线程锁定了互斥锁,则没有其他线程可以在同一时间成功锁定这个互斥量。 ·唯一性:如果 阅读全文
posted @ 2019-01-20 14:57 red_leaf_412 阅读(10789) 评论(0) 推荐(0) 编辑
摘要:消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识。具有足 够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息。在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。System V 消息队列是 阅读全文
posted @ 2019-01-06 15:21 red_leaf_412 阅读(730) 评论(0) 推荐(0) 编辑
摘要:Posix消息队列可以认为是一个消息链表. 有足够写权限的线程可以往队列中放置消息, 有足够读权限的线程可以从队列中取走消息 在某个进程往一个队列写入消息前, 并不需要另外某个进程在该队列上等待消息的到达. 这跟管道和FIFO是相反的, 因为对于管道,FIFO来说, 除非读出者已经存在, 光有写入者 阅读全文
posted @ 2018-11-24 21:09 red_leaf_412 阅读(3851) 评论(0) 推荐(1) 编辑
摘要:前面介绍的pipe属于匿名管道 管道的主要局限性正体现在它的特点上: 只支持单向数据流; 只能用于具有亲缘关系的进程之间; 没有名字; 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小); 管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格 阅读全文
posted @ 2018-10-27 19:43 red_leaf_412 阅读(3487) 评论(0) 推荐(0) 编辑
摘要:我们在执行shell命令比如cat /etc/group | grep root的时候,通过管道的机制将cat /etc/group的结果传递给grep root,然后将结果显示出来 linux中提供了popen和pclose函数来达到这个目的。 FILE *popen(const char *co 阅读全文
posted @ 2018-10-20 16:22 red_leaf_412 阅读(673) 评论(0) 推荐(0) 编辑
摘要:2在前面介绍过,进程之间交换信息的唯一途径就是传送打开的文件。可以经由fork或者exec来传送。这一章将介绍新的进程共享方式 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓 阅读全文
posted @ 2018-10-14 10:39 red_leaf_412 阅读(5426) 评论(0) 推荐(1) 编辑
摘要:前面介绍了select处理,这一章继续介绍另外一种I/O多路服用的机制:epoll。来比较下两种机制的不同点。 select: 调用过程如下: (1)使用copy_from_user从用户空间拷贝fd_set到内核空间 (2)注册回调函数__pollwait (3)遍历所有fd,调用其对应的poll 阅读全文
posted @ 2018-09-16 15:20 red_leaf_412 阅读(542) 评论(0) 推荐(0) 编辑
摘要:一般我们在写socet程序的时候调用的accept,recv等操作都是阻塞型的。意思就是如果我们一直收不到数据那么则会被阻塞。所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回 可是使用Select就可以完 阅读全文
posted @ 2018-09-08 22:55 red_leaf_412 阅读(337) 评论(0) 推荐(0) 编辑
摘要:记录锁的功能:当一个进程正在读或修改文件的某个部分是,它可以阻止其他进程修改同一文件区。对于这个功能阐述我认为有三点要解释的: 记录锁不仅仅可以用来同步不同进程对同一文件的操作,还可以通过对同一文件加记录锁,来同步不同进程对某一共享资源的访问,如共享内存,I/O设备。 对于劝告性上锁,当一个进程通过 阅读全文
posted @ 2018-09-02 22:13 red_leaf_412 阅读(335) 评论(0) 推荐(0) 编辑
摘要:通常来说,从普通文件读数据,无论你是采用 fscanf,fgets 也好,read 也好,一定会在有限的时间内返回。但是如果你从设备,比如终端(标准输入设备)读数据,只要没有遇到换行符(‘\n’),read 一定会“堵”在那而不返回。还有比如从网络读数据,如果网络一直没有数据到来,read 函数也会 阅读全文
posted @ 2018-08-12 15:53 red_leaf_412 阅读(2267) 评论(0) 推荐(0) 编辑
摘要:#include <pthread.h> int pthread_mutexattr_init( pthread_mutexattr_t *attr ); int pthread_mutexattr_destroy( pthread_mutexattr_t *attr ); 返回值:若成功则返回0, 阅读全文
posted @ 2018-08-04 21:50 red_leaf_412 阅读(462) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示