
linux环境高级编程
文章平均质量分 83
鱼思故渊
这个作者很懒,什么都没留下…
展开
-
linux 进程间通信----共享内存(下)
共享内存的原理:(system V)进程间需要共享的数据被放在一个叫做IPC共享内存区域的地方,所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间中去。系统V共享内存通过shmget获得或创建一个IPC共享内存区域,并返回相应的标识符。内核在保证shmget获得或创建一个共享内存区,初始化该共享内存区相应的shmid_kernel结构注同时,还将在特殊文件系统shm中,创建原创 2013-08-11 10:14:14 · 964 阅读 · 0 评论 -
linux 进程间通信-----共享内存(上)
文章内容参考网络、unix网络编程(卷二)原创 2013-08-10 15:24:40 · 1347 阅读 · 0 评论 -
使用GDB调试程序
下午原创 2013-08-11 11:43:58 · 1061 阅读 · 0 评论 -
make命令的使用及参数解析
make命令参数make是一个Linux下的二进制程序,用来处理Makefile这种文本文件。在Linux的Shell命令行键入make的时候,将自动寻找名称为"Makefile"的文件作为编译文件,如果没有名称为"Makefile"的文件,将继续查找名称为"makefile"的文件。找到编译文件后,make工具将根据Makefile中的第一个目标自动寻找依赖关系,找出这个目标所需要的其他原创 2013-08-14 20:06:01 · 4347 阅读 · 0 评论 -
编程修养(上)
编程修养————什么是好的程序员?是不是懂得很多技术细节?还是懂底层编程?还是编程速度比较快?我觉得都不是。对于一些技术细节来说和底层的技术,只要看帮助,查资料就能找到,对于速度快,只要编得多也就熟能生巧了。我认为好的程序员应该有以下几方面的素质: 1、有专研精神,勤学善问、举一反三。 2、积极向上的态度,有创造性思维。 3、与人积极交流沟通的能力,有团队转载 2013-08-16 08:07:03 · 1124 阅读 · 1 评论 -
编程修养(中)
1、版权和版本———————好的程序员会给自己的每个函数,每个文件,都注上版权和版本。对于C/C++的文件,文件头应该有类似这样的注释:/************************************************************************** 文件名:network.c** 文件描述:网络通讯函数集**转载 2013-08-16 08:11:43 · 865 阅读 · 0 评论 -
编程修养(下)
16、把相同或近乎相同的代码形成函数和宏—————————————————————有人说,最好的程序员,就是最喜欢“偷懒”的程序,其中不无道理。如果你有一些程序的代码片段很相似,或直接就是一样的,请把他们放在一个函数中。而如果这段代码不多,而且会被经常使用,你还想避免函数调用的开销,那么就把他写成宏吧。千万不要让同一份代码或是功能相似的代码在多个地方存在,不然如果功能一转载 2013-08-16 08:19:13 · 832 阅读 · 0 评论 -
用GDB调试程序(上)
出处:http://blog.youkuaiyun.com/haoel/article/details/2879转载 2013-08-17 09:01:04 · 954 阅读 · 0 评论 -
用GDB调试程序(中)
四、维护停止点上面说了如何设置程序的停止点,GDB中的停止点也就是上述的三类。在GDB中,如果你觉得已定义好的停止点没有用了,你可以使用delete、clear、disable、enable这几个命令来进行维护。 clear 清除所有的已定义的停止点。 clear clear 清除所有设置在函数上的停止点。 cle转载 2013-08-17 15:09:06 · 828 阅读 · 0 评论 -
用GDB调试程序(下)
七、设置显示选项 GDB中关于显示的选项比较多,这里我只例举大多数常用的选项。 set print address set print address on 打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的,如: (gdb) f #0 set_quotes转载 2013-08-17 15:18:23 · 978 阅读 · 0 评论 -
跟我一起写Makefile文件(上)
这系列的文章是转载陈皓老师的文章,比较详细的介绍了Makefile文件的书写规范和应用规则。概述——什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解转载 2013-08-29 09:41:17 · 1061 阅读 · 0 评论 -
跟我一起写Makefile文件(中)
六、多目标Makefile的规则中的目标可以不止一个,其支持多目标,有可能我们的多个目标同时依赖于一个文件,并且其生成的命令大体类似。于是我们就能把其合并起来。当然,多个目标的生成规则的执行命令是同一个,这可能会可我们带来麻烦,不过好在我们的可以使用一个自动化变量“$@”(关于自动化变量,将在后面讲述),这个变量表示着目前规则中所有的目标的集合,这样说可能很抽象,还是看一个例子吧。转载 2013-08-29 10:12:46 · 1024 阅读 · 0 评论 -
跟我一起写Makefile文件(下)
make 的运行——————一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想在不同的时候使用不同的编译规则,等等。本章节就是讲述如何使用make命令的。一、make的退出码make命令执行后有三个退出码: 0转载 2013-08-29 18:29:49 · 905 阅读 · 0 评论 -
使用automake自动生成makefile(上)
利用Linux下自动生成makefile的工具: automake, autoconf 生成makefile的一般过程1. 创建工程目录和各个目录下的makefile.am。工程的名字一般和最终生成应用程序的名字相同。[cpp] view plaincopywzb@embedded ~]$ mkdir workspace [wzb@emb原创 2013-08-29 18:31:02 · 1019 阅读 · 0 评论 -
使用automake自动生成makefile文件(中)
引子无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或 make install。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和 makefile工具就可以轻而易举的理顺各个源文件之间纷繁复杂的相互关系。但是如果通过查阅ma原创 2013-08-29 18:46:32 · 1087 阅读 · 0 评论 -
一个fork的面试题
前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下。这个题是这样的:题目:请问下面的程序一共输出多少个“-”?1234567891011121314#include #include #inc转载 2013-08-30 15:12:20 · 1009 阅读 · 1 评论 -
linux系统系Makefile使用须知(动态链接库深入理解)
linux下面共享库默认路径是/usr/lib. /usr/local/lib. /lib一般的ELF格式的可执行文件可以通过readelf --d xxx。来获得共享库和程序运行时的库的路径和信息1、把我写好的动态库放到系统目录里。缺点:1a、系统目录被搞的很混乱。1b、在别人电脑上部署会很麻烦。2、指定LD_LIBRARY_PATH环境变量。缺点:不能直接启动应用程序而转载 2013-09-11 15:07:33 · 1943 阅读 · 0 评论 -
如何调试makefile变量
六、七年前写过一篇《跟我一起写Makefile》,直到今天,还有一些朋友问我一些Makefile的问题,老实说,我有一段时间没有用Makefile了,生疏了。回顾,这几年来大家问题我的问题,其实很多时候是makefile的调试问题。所以,就像我在之前的那篇关于GDB的技巧的文章中做的一样,在这里向大家介绍一个小小的调试变量的技巧。相信一定对你有用。对于Makefile中的各种变量,可能是我们比转载 2013-10-03 09:37:32 · 1038 阅读 · 0 评论 -
makefile的书写规范(一)
0 Makefile概述 -------------------------------------------------------------------------------- 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要原创 2013-08-14 19:41:31 · 1592 阅读 · 0 评论 -
linux信号signal处理机制(三)
前面两节已经介绍了有关信号的大部分知 识。这一节我们来了解一下这些系统调用。其中,系统调用signal是进程用来设定某个信号的处理方法,系统调用kill是用来发送信号给指定进程的。这 两个调用可以形成信号的基本操作。后两个调用pause和alarm是通过信号实现的进程暂停和定时器,调用alarm是通过信号通知进程定时器到时。所 以在这里,我们还要介绍这两个调用。 1、sign转载 2013-09-22 21:52:27 · 1237 阅读 · 0 评论 -
linux信号signal处理机制(一)
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。 一、信号的基本概念转载 2013-09-22 21:51:14 · 1252 阅读 · 0 评论 -
linux信号signal处理机制(四)
4、alarm和 setitimer系统调用 系统调用alarm的功能是设置一个定时器,当定时器计时到达时,将发出一个信号给进程。该调用的声明格式如下: unsigned int alarm(unsigned int seconds); 在使用该调用的进程中加入以下头文件: #include 系 统转载 2013-09-22 21:53:16 · 1669 阅读 · 0 评论 -
linux信号signal处理机制(二)
二、信 号 机 制 上 一节中介绍了信号的基本概念,在这一节中,我们将介绍内核如何实现信号机制。即内核如何向一个进程发送信号、进程如何接收一个信号、进程怎样控制自己对信 号的反应、内核在什么时机处理和怎样处理进程收到的信号。还要介绍一下setjmp和longjmp在信号中起到的作用。 1、内核对信号的基本处理方法 内 核给一个进程发送软中断信号的方法,是在进程所在的进程表项的信号域设置对应于该信号转载 2013-09-22 21:51:33 · 939 阅读 · 0 评论 -
getchar()与EOF总结
大师级经典的著作,要字斟句酌的去读,去理解。以前在看K&R的The C Programming Language(SecondEdition)第1.5节的字符输入/输出,被getchar()和EOF所迷惑了。可能主要还是由于没有搞清楚getchar()的工作原理和EOF的用法。因此,感觉很有必要总结一下,不然,很多琐碎的知识点长时间过后就会淡忘的,只有写下来才是最好的方法。其实,g转载 2013-09-22 22:49:14 · 1255 阅读 · 0 评论 -
UNIX网络编程--socket中的同步/异步 阻塞/非阻塞
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这原创 2013-09-23 15:21:44 · 3818 阅读 · 0 评论 -
同步/异步 阻塞/非阻塞区别
我喜欢用自己的语言通过联系现实生活中的一些现象解释一些概念,当我能做到这一点时,说明我已经理解了这个概念.今天要解释的概念是:同步/异步与阻塞/非阻塞的区别.这两组概念常常让人迷惑,因为它们都是涉及到IO处理,同时又有着一些相类似的地方.首先来解释同步和异步的概念,这两个概念与消息的通知机制有关.举个例子,比如我去银行办理业务,可能选择排队等候,也可能取一个小纸条上面有我的转载 2013-09-23 08:02:53 · 1465 阅读 · 0 评论 -
UNIX环境高级编程--高级I/O(三)
一、高级I/O mmap()函数的使用 #include void * mmap(void *addr,size_t len,int port,int flags,int fd,off_t offset);使用read()、write()系统调用需要从用户缓冲区进行数据读写,而使用映射文件进行操作可以避免多余的数据拷贝。除了潜在的页错误,读写映射文件不原创 2013-09-24 22:53:51 · 2023 阅读 · 0 评论 -
UNIX环境高级编程--标准I/O库(二)
标准I/O库处理很多细节,例如缓冲区分配,以优化长度执行I/O等。标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。标准I/O提供了三种类型的缓冲:1)全缓冲。这种情况下,在填满标准I/O缓冲区后才进行实际I/O操作。对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲的。在一个流上执行第一次I/O操作时,相关标准I/O函数通常调用malloc获得需使用的缓冲区原创 2013-09-25 08:13:53 · 2445 阅读 · 0 评论 -
页高速缓存和页回写
页高速缓存是linux内核实现磁盘缓存。它主要用来减少对磁盘的I/O操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。 磁盘高速缓存之所以在任何现代操作系统中尤为重要源自两个因素:第一,访问磁盘的速度要远远低于访问内存的速度,因此,从内存访问数据比从磁盘访问速度要快,若从处理器L1和L2高速缓存访问则更快。第二,数据一旦被访问,就很有可能在短期内再原创 2013-09-25 17:42:47 · 3587 阅读 · 0 评论 -
undefined reference to 'pthread_create'
在开发多线程的程序时,有时结果出现如下错误:undefined reference to 'pthread_create'undefined reference to 'pthread_join'问题原因: pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pth原创 2013-10-13 19:49:02 · 1085 阅读 · 0 评论 -
判断CPU模式是大端还是小段(big-Endian和little-Endian)
一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必原创 2013-10-25 18:57:21 · 7011 阅读 · 0 评论 -
简单的几个文件操作(C)
一.关于文件操作的几个基本函数1.C函数库中文件操作函数(1)fopen函数原型:FILE* fopen(char *path, char *mode);函数说明:打开一个文件。 (2)fgetc函数原型:int fgetc(FILE *stream);函数说明:从文件中读取一个字符。出错或文件尾返回EOF。(3)fputc函数原型:int fputc(int原创 2013-11-02 21:12:07 · 1439 阅读 · 0 评论 -
linux下使用GCC生存和使用静态、动态库
一、基本概念1.1什么是库在windows平台和linux平台下都大量存在着库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的平台不同(主要是编译器、汇编器和连接器的不同),因此二者库的二进制是不兼容的。本文仅限于介绍linux下的库。 1.2库的种类linux下的库有原创 2013-11-02 21:44:46 · 1458 阅读 · 0 评论 -
C中判断文件结束的两种方法feof()和EOF
判断文件结束有两种方法:EOF和feof() 查看stdio.h可以看到如下定义:[cpp] view plaincopyprint?#define EOF (-1) #define _IOEOF 0x0010 #define feof(_stream) ((_stream)->_flag & _IOEO 由此可以看出,这两种方式的原理原创 2013-11-17 10:31:56 · 7992 阅读 · 0 评论 -
回调函数 函数指针
回调函数是指通过函数参数传递给其他代码的某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。回调的用途十分广泛。例如,假设有一个函数,其功能为读取配置文件并由文件内容设置对应的选项。若这些选项由散列值所标记,则让这个函数接受一个回调会使得程序设计更加灵活:函数的调用者可以使用所希望的散列算法,该算法由一个将选项名转变为散列值的回调函数实现;因此,回调允许函数调用者在运行时原创 2013-11-02 12:08:36 · 1359 阅读 · 0 评论 -
linux中加载动态库
在Linux中可以动态加载库,其使用方法如下:1. 先生成一个动态库libtest.so/* test.c */#include #include void test1(int no){ printf("*****************************************\n"); printf("This is test1, the原创 2013-11-02 13:12:07 · 2608 阅读 · 0 评论 -
数组和指针参数在函数形参中的表示
1、数组的数组 char c[8][10];(有步长,10char) char(*)[10]; 数组指针2、指针数组 char *c[15];(无步长) char **c; 指针的指针 3、数组指针(行) char (*c)[64];(有步长,64char) char (*c)[64]; 不改原创 2013-11-03 21:42:46 · 1471 阅读 · 0 评论 -
C语言的赋值++是否为原子操作
相关概念:时钟周期、总线周期和指令周期1.时钟周期:微处理器执行指令的最小时间单位,又称T状态。它通常与微机的主频有关。2.总线周期:CPU对存储器或I/O端口完成一次读/写操作所需的时间。如8086微处理器的基本总线周期由四个时钟周期T1~T4组成,80486微处理器的基本总线周期由T1和T2两个时钟周期组成。当外设速度较慢时,可插入等待周期Tw。3.指令周期:CPU执行一条指令原创 2013-11-03 22:14:50 · 3676 阅读 · 1 评论 -
pthread_mutex_t的使用
#include l 函数原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;l 函数作用:该函数用原创 2013-11-04 22:40:25 · 30771 阅读 · 2 评论 -
liunx中可重入和不可重入函数
可重入函数可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏。可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失。可重入函数使用的变量有两种情况:1.使用局部变量,变量保存在CPU寄存器中或者堆栈中;2.使用全局变量,但是这时候要注意保护全局变量(防止任务中断后被其它任务改变变量)。void strcpy(*原创 2013-11-06 08:32:53 · 1334 阅读 · 0 评论