摘要: 智能指针:它的一种通用实现方法是采用引用计数的方法。智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针。 每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;这是因此左侧的指针指向了右侧指针所指向的对象,因此右指针所指向的对象的引用计数+1;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。实现智能指针有两种经典策略:一... 阅读全文
posted @ 2012-03-18 11:11 杨少宁 阅读(24092) 评论(5) 推荐(4) 编辑
摘要: 主要有三种方案:(1)调用Alarm,它在指定超时期满时产生SIGALRM信号,此方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的ALARM调用。(2)在SELECT,即多路复用中阻塞等待IO,因为select有内置的时间限制,以此代替直接阻塞在read或write上的调用。(3)使用较新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项,这个方法的问题在于并非所有的实现都支持这两个套接字选项。一、首先看一个如何调用Alarm,它主要是通过对慢系统调用产生中断信号来完成。int connect_timeo(int sockfd, const SA *sapt 阅读全文
posted @ 2012-03-17 23:51 杨少宁 阅读(2281) 评论(0) 推荐(1) 编辑
摘要: 先描述一下整体的流程及思路: 客户端从标准输入读取一行文本,发送给服务器,服务器收到文本后,将文本直接返回给客户端,即回显。整体采用TCP协议完成。 客户端大致代码:socket,connect函数略去char sendline[1024],recvline[1024];while( fgets(sendline, 1024, stdin) != NULL){ //从标准输入读取 writen(sockfd,sendline,strlen(sendline)); //发送给服务器,Sockfd就是与服务器联通的Socket if(readline(sockfd, recvlin... 阅读全文
posted @ 2012-03-15 19:05 杨少宁 阅读(4769) 评论(3) 推荐(3) 编辑
摘要: 为允许在线程或进程间共享数据,同步通常是必须的。常见的同步方式有:互斥锁、条件变量、读写锁、信号量。另外,对于进程间的同步,也可以通过进程间通信的方式进行同步,包括管道(无名管道、有名管道)、信号量、消息队列、共享内存、远程过程调用,当然也可以通过Socket来进行网络控制。一. 互斥锁和条件变量是同步的基本组成部分 互斥锁和条件变量出自Posix.1线程标准,多用来同步一个进程中各个线程。但如果将二者存放在多个进程间共享的内存区中,它们也可以用来进行进程间的同步。1. 互斥锁用于保护临界区,以保护任何时刻只有一个线程在执行其中的代码,其大体轮廓大体如下: lock_the_mutex... 阅读全文
posted @ 2012-03-13 23:09 杨少宁 阅读(9498) 评论(6) 推荐(3) 编辑
摘要: 1. 统计一个目录下所有普通文件的总行数#实用场景:毕业设计时,需要统计自己的代码行数# 方案一:find.-typef-name"*.c"-execcat{}\;|grep-v'^$'|wc-l 解释:find . -type f -name "*.c" 查找当前目录下所有以.c结尾的文件,如果不考虑文件类型,可以直接实用find . -type f即可。 -exec cat {} \; 是将找到的文件采用cat命令输出; grep -v '^$' 是将不是空行的内容进行统计,如果是空行就不统计,它相当于一个过滤器。 w 阅读全文
posted @ 2011-10-16 16:07 杨少宁 阅读(1684) 评论(1) 推荐(2) 编辑
摘要: 在文件score.txt中存有如下数据:(姓名 分数)lisi 88bokeyuan 97zhangsan 77wangwu 89hongliu 92zhanghua 97在文件student.txt中存有:zhangsanhongliu使用awk, cut, grep, find等任意shell脚本,输出student.txt所有学生的分数,即输出:zhangsan 77hongliu 92如果只在score.txt中处理,可以很容易得写出awk ' { if ($1 == "zhangsan") print $0} ' score.txt但是结合另外一个 阅读全文
posted @ 2011-09-25 15:43 杨少宁 阅读(5811) 评论(1) 推荐(0) 编辑
摘要: 一、选择题(皆为单选)1,以下谁是二进制思想的最早提出者?【选A??http://baike.baidu.com/view/13762.htm】a,伏羲;b,姬昌;c,莱布尼茨;d,柏拉图。2,以下哪个概念和公孙龙的《指物论》中的“指”字含义相近?【貌似是A,http://zhidao.baidu.com/question/7565059.html】a,变量;b,数组;c,对象;d,指针。3,蔺相... 阅读全文
posted @ 2011-04-02 08:30 杨少宁 阅读(28427) 评论(58) 推荐(20) 编辑
摘要: 在上一篇文章中,写了一些串口通信时数据接收的内容,其中有一行代码有个提问:在数据接收线程中,当接收到数据并且校验正确后,我怎么显示这些数据到窗体中呢?要显示数据,必须要访问主线程(A)的各种控件,而数据接收是另一个线程(B)。有两种方案可以解决这个问题,和上文一样,也是第二个较好。方法一:取消跨线程操作检查当线程B在访问线程A创建的控件时,线程A会对控件的线程锁进行检验,当多个线程同时对控件进行写操作时,必然产生冲突,因此此时的程序会非常不稳定,经常突然就退出,Debug显示原因是跨线程操作控件了。既然如此,那就让线程A不去检验其他线程了,在Form_Load函数里加一句:System.Win 阅读全文
posted @ 2011-01-21 12:54 杨少宁 阅读(3368) 评论(5) 推荐(4) 编辑
摘要: 利用串口进行通信,当发送方(A)将数据写入串口后,通过无线或有线方式将数据传送给接收方(B),B通过调用串口读方法comm.read(参数)即可将数据读出。原理十分简单,但最近在利用串口处理SM-42无线传输时,数据总是一段一段的传到B,并不能在comm_DataReceived方法中单纯使用read方法将数据接收完全。我知道用缓存机制,但由于经验少(正在实习),到网上找了找大牛们的方法,并结合自己的理解,发现有两种方法可以处理。方法一:comm_DataReceived(Comm控件的数据接收方法,当有数据来临时会触发)会创建一个线程(悲哀,因为之前不知道它另辟线程,所以自己编写了一个线程处 阅读全文
posted @ 2011-01-21 11:30 杨少宁 阅读(13358) 评论(24) 推荐(8) 编辑
摘要: 对于一个进程,它每次打开、创建或者删除一个文件时,内核就要对该进程进行文件访问权限测试,而在对具体某个文件进行测试时,还需要测试其对目录(也就是文件路径)进行权限测试。比如要修改/usr/include/stdio.h,需要对/、/usr和/usr/include这三个目录进行权限测试,保证有对这三个目录的执行权限(目录索引需要执行权限,读权限只是显示)。进行访问权限测试的过程如下【涉及文件所有者(st_uid和st_gid)和进程的有效ID(有效用户ID及有效组ID)】:(1)若进程有效用户ID为0(超级用户),则有所有权限(2)若进程的有效用户ID=文件所有者ID,表明该进程拥有该文件,此 阅读全文
posted @ 2010-12-12 20:58 杨少宁 阅读(3251) 评论(1) 推荐(1) 编辑