随笔分类 -  Z技术(C/C++/Objective-c)

摘要:Cocoa是什么,Cocoa是使用OC语言编写的工具包,里面有大量的类库、结构体,其实就相当于java中的标准API、C++中的标准库。OC中没有命名空间的概念,所以使用加前缀来防止命名冲突,因此你会看到大量的以NS 为前缀的类名、结构体、枚举等。Cocoa框架由Foundation Kit、App... 阅读全文
posted @ 2014-03-08 19:30 Leo.cheng 阅读(976) 评论(0) 推荐(0) 编辑
摘要:TCP的socket本身就是长连接的,那么为什么还要心跳包呢? 在smack里有个30s发送一个空消息的线程,同样关于心跳包(keepalive) 据网络搜索到的资料解释如下内网机器如果不主动向外发起连接,外网机没法直连内网的,这也是内网机安全的原因之一,又因为路由器会把这个关系记录下来,但是过... 阅读全文
posted @ 2014-02-24 21:50 Leo.cheng 阅读(22283) 评论(1) 推荐(2) 编辑
摘要:无名管道pipe 无名管道又被称为pipe,是进程间通信的一种方式。 pipe具有以下特点:只能用于具有血缘关系的进程之间半双工的通信模式,具有固定的读端和写端一种特殊的文件,存在于内存中。可通过read、write对其操作 因为pipe存在于内存中,所以无法像操作普通文件那样通过指定路径来打... 阅读全文
posted @ 2013-10-04 17:25 Leo.cheng 阅读(2169) 评论(0) 推荐(1) 编辑
摘要:名词解析 IP地址的作用是标示计算机的网卡地址,每台计算机都有一个IP地址; 端口是指计算机中为了标示在计算机中访问网络的不同程序而设的编号,并不是网卡接线的端口,而是不同程序的逻辑编号,并不是实际存在的; 域名是用来代替IP地址来标示计算机的一种直观名称,例如百度网站的IP地址是202.10... 阅读全文
posted @ 2013-09-28 15:27 Leo.cheng 阅读(466) 评论(0) 推荐(0) 编辑
摘要:系统说明 前段时间做的一个智能点餐系统,从0开始,用时3天,其中调bug(内存拷贝)调了一天,囧,现记一些架构文档 这个系统涉及到的知识点还是挺多的典型的c/s模式,socket通信多线程操作数据库操作临界资源的互斥操作 其它的就是功能架构上的一些细节问题,具体问题具体分析,分析过程已经全部留... 阅读全文
posted @ 2013-08-11 11:48 Leo.cheng 阅读(1561) 评论(0) 推荐(0) 编辑
摘要:条件变量 条件变量用来阻塞线程等待某个事件的发生,并且当等待的事件发生时,阻塞线程会被通知。 互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。 而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。 使用时,条件变量被用来阻塞一个线程,当条件不... 阅读全文
posted @ 2013-08-04 17:42 Leo.cheng 阅读(2568) 评论(0) 推荐(0) 编辑
摘要:互斥锁 互斥锁用来保证同一时间内只有一个线程在执行某段代码(临界区)。多线程编程最容易出问题的地方,就是临界区的界定和访问控制。 下面是一个生产者,消费者的简单例子。生产者、消费者公用一个缓冲区,这里假定缓冲区只能存放一条消息。生产者,消费者互斥 1 //生产者,消费者问题 2 //生产者、消费... 阅读全文
posted @ 2013-08-04 16:24 Leo.cheng 阅读(1339) 评论(0) 推荐(0) 编辑
摘要:多线程优点 使用线程的理由之一: 和进程相比,它是一种“节俭”的多任务操作方式。在linux系统下,启动一个新的进程必须分配给他独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种“昂贵的”多任务工作方式。运行于一个进程中的多个线程,他们之间使用相同的地址空间,而且线程间彼... 阅读全文
posted @ 2013-08-04 15:47 Leo.cheng 阅读(629) 评论(0) 推荐(0) 编辑
摘要:共享内存 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区。在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一 个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做。应用 共享内存的使用,主要... 阅读全文
posted @ 2013-08-04 14:52 Leo.cheng 阅读(770) 评论(0) 推荐(0) 编辑
摘要:信号量 信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源。 进程可以根据它判断是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步。 当进程A要获取临界资源S时,首先要获取临界资源的信号量M,M的初始值为1,当获取到M并发现M的值大于1时,可以反问临界资源M... 阅读全文
posted @ 2013-08-04 12:17 Leo.cheng 阅读(1146) 评论(0) 推荐(0) 编辑
摘要:发展 unix早期通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便。消息队列(报文队列)则克服了这些缺点。定义 消息队列就是一个消息的链表。可以把消息看做一个记录,具有特定的格式。进程可以向中按照一定的规则添加新消息;另一些进程则可以从消息队列... 阅读全文
posted @ 2013-08-04 11:27 Leo.cheng 阅读(418) 评论(0) 推荐(0) 编辑
摘要:什么是管道 管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。管道的分类 管道包括无名管道和命名管道两种,前者用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。无... 阅读全文
posted @ 2013-08-04 10:58 Leo.cheng 阅读(865) 评论(0) 推荐(0) 编辑
摘要:信号方式(中断)信号的基本概念 每个信号都对应一个正整数常量(称为signal number,即信号编号。定义在系统头文件中),代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进程发生了某异常事件。每个进程在运行时,都要通过信号机制来检查是否有信号到达。若有,便中断正在执行的程序,转向... 阅读全文
posted @ 2013-08-04 10:09 Leo.cheng 阅读(1525) 评论(0) 推荐(1) 编辑
摘要:进程创建-->进程表 系统用一个叫做“进程表”的东西来维护系统中的进程,进程表中的一个条目维护着存储着一个进程的相关信息,比如进程号,进程状态,寄存器值等等... 当分配给进程A的“时间片”使用完时,CPU会进行上下文切换以便运行其他进程,比如进程B,这里所谓的“上下文切换”,主要就是在操作那个... 阅读全文
posted @ 2013-08-03 23:34 Leo.cheng 阅读(659) 评论(0) 推荐(0) 编辑
摘要:fwrite实现文件复制 1 //@ author 成鹏致远 2 //@ net http://infodown.tap.cn 3 //@ qq 552158509 4 //@ blog lcw.cnblogs.com 5 6 #include 7 #include 8 #include 9 10 #define BUFSIZE 10011 12 int main(int argc, char * argv[])13 {14 FILE *read_fp,*write_fp;15 char buf[BUFSIZE];16 17 if(3 != argc)18 ... 阅读全文
posted @ 2013-08-03 19:17 Leo.cheng 阅读(460) 评论(0) 推荐(0) 编辑
摘要:void指针 void指针平时用的地方不多,但是不代表它不重要#include typedef int*(*TY)[5]; //指针数组的指针类型int main(void){ void *p1,*p2,*p3; int a1 = 100; int *px = &a1; //一级指针 int **py = &px; //二级指针 int a[5] = {1,2,3,4,5}; int *b[5] = {a,a+1,a+2,a+3,a+4}; //指针数组 p1 = &py; p2 = b; p3 = &b; ... 阅读全文
posted @ 2013-07-25 13:14 Leo.cheng 阅读(1023) 评论(0) 推荐(1) 编辑
摘要:判断日期为一年中的第几天(考虑闰年) 1 /* 2 * 计算该日在本年中是第几天,注意闰年问题 3 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 4 * 特殊情况,闰年且输入月份大于3时需考虑多加一天 5 */ 6 7 /* 8 *@author: 成鹏致远 9 *@net: http://infodown.tap.cn10 */11 12 #include 13 #include 14 15 struct year_mon_day16 {17 int year;18 int mon;19 int day;20 };21 22 int ... 阅读全文
posted @ 2013-07-22 11:24 Leo.cheng 阅读(3171) 评论(7) 推荐(3) 编辑
摘要:在x86平台下分析下面的代码输出结果 1 int main(void) 2 3 { 4 5 int a[4] = {1, 2, 3, 4}; 6 7 int *ptr1=(int *)(&a+1); 8 9 int *ptr2=(int *)((int)a+1);10 11 printf("%x, %x/n", ptr1[-1], *ptr2);12 13 return 0;14 15 }&a+1 首先明确,a是一个具有4个整型变量的数组的名字,具体地说是这种数组的首元素的首地址,而&a是数组的首地址,请注意措辞。而关于指针加1,则需要指针运算... 阅读全文
posted @ 2013-07-13 18:21 Leo.cheng 阅读(896) 评论(0) 推荐(1) 编辑
摘要:对数组名进行取地址运算int a[] = {1,2,3};int (*p)[3] = &a; //注意左值对数组名取地址,得到的指针为指向整个数组的指针。形参数组形参为数组时勿须带数组长度,因为计算机不会处理,如果需要传数组长度,需要另外加参数。一维数组指针 1 #include 2 3 //void array_add(int a[], int len) 4 void array_add(int *p, int len) 5 { 6 int i = 0; 7 8 for(i=0; i 2 3 //void array_add(int a[][], int len... 阅读全文
posted @ 2013-07-13 17:26 Leo.cheng 阅读(849) 评论(0) 推荐(1) 编辑
摘要:题目以下两个程序片段A 和B ,问哪个能进入循环?片段A:unsigned short i;unsigned short index = 0;for(i=0; i < index-1; i++){ ........}片段B:unsigned short i;unsigned long index = 0;for(i=0; i < index-1; i++){ ........}解答 此题主要考虑类型之间的隐式转换问题,答案是B能进入循环 对于片段A:short - int 的结果是int 型的,所以结果是:0<-1,不满足条件; 对于片段B:unsigned long - i 阅读全文
posted @ 2013-07-12 11:42 Leo.cheng 阅读(423) 评论(0) 推荐(0) 编辑