linux编程
文章平均质量分 74
阿磊2013
这个作者很懒,什么都没留下…
展开
-
sublime text3 安装ctags
在公司看代码,都是source insight和sublime text一起用的,前者看代码,后者b原创 2014-11-07 23:25:14 · 26027 阅读 · 4 评论 -
Linux环境进程间通信---共享内存(上)
采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在转载 2011-08-11 22:24:06 · 833 阅读 · 0 评论 -
Linux环境进程间通信---共享内存(下)
系统调用mmap()通过映射一个普通文件实现共享内存。系统V则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信。也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件(这是通过shmid_kernel结构联系起来的),后面还将阐述。1、系统V共享内存原理转载 2011-08-11 22:27:06 · 1155 阅读 · 0 评论 -
今天晚上,学习了地址管理的一点小总结
最近几天,一直在看一个DD的source。发现,不理解一下地址的管理是不行了。晚上搜了一晚上,看了不少的文章,发现还是一知半解的。睡觉前,先把今天的领悟写出来吧: 首先,逻辑地址。 逻辑地址是段式管理相关的那个地址。什么代码段了,数据段了,的那个。 其次,虚拟地原创 2011-08-04 23:26:52 · 913 阅读 · 0 评论 -
linux调试工具glibc的演示分析
<br /> 一)MALLOC_CHECK_GNU的标准库(glibc)可以通过内置的调试特性对动态内存进行调试,它就是MALLOC_CHECK_环境变量,它在默认情况下是不设定的,在老的版本默认这个值为0,新的版本默认值为2,但有一个矛盾,如果设为2,它将会打印出长长的跟踪信息,这比设为2更详细.MALLOC_CHECK_有三种设定,即:MALLOC_CHECK_=0 ----- 关闭所有检查.MALLOC_CHECK_=1 ----- 当有错误被探测到时,在标准错误输出(stderr)上打印错误信息.M转载 2011-04-10 17:37:00 · 1236 阅读 · 0 评论 -
linux调试工具glibc的演示分析
<br /> 一)MALLOC_CHECK_GNU的标准库(glibc)可以通过内置的调试特性对动态内存进行调试,它就是MALLOC_CHECK_环境变量,它在默认情况下是不设定的,在老的版本默认这个值为0,新的版本默认值为2,但有一个矛盾,如果设为2,它将会打印出长长的跟踪信息,这比设为2更详细.MALLOC_CHECK_有三种设定,即:MALLOC_CHECK_=0 ----- 关闭所有检查.MALLOC_CHECK_=1 ----- 当有错误被探测到时,在标准错误输出(stderr)上打印错误信息.M转载 2011-04-10 17:37:00 · 1828 阅读 · 0 评论 -
linux 中实际用户ID”、“有效用户ID”和“保存的设置用户ID”三个术语
<br /> THE USER ID OF A PROCESS <br /><br />内核会给每个进程关联两个和进程ID无关的用户ID,一个是真实用户ID,还有一个是有效用户ID或者称为 setuid(set user ID)。真实用户ID用于标识由谁为正在运行的进程负责。有效用户ID用于为新创建的文件分配所有权、检查文件访问许可,还用于通过kill系统调用向其它进程发送信号时的许可检查。内核允许一个进程以调用exec一个setuid程序或者显式执行setuid系统调用的方式改变它的有效用户ID。 <br转载 2011-01-18 21:51:00 · 1855 阅读 · 1 评论 -
linux用户标识UID与有效用户标识EUID
<br />linux系统中每个进程都有2个ID,分别为用户ID和有效用户ID,UID一般表示进程的创建者(属于哪个用户创建),而EUID表示进程对于文件和资源的访问权限(具备等同于哪个用户的权限)。可以通过函数getuid()和geteuid()或者进程的两个ID值。 当一个用户登陆系统时,系统会将UID和EUID都赋值为/etc/passwd文件中的UID,一般情况下2个ID是相同的,但是某些情况下会出现2个ID不同的情况。 以下通过一个典型问题和代码实例来说明UID和EUID的问题。 【关于linux转载 2011-01-18 21:44:00 · 996 阅读 · 0 评论 -
select函数
<br />Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 <br />connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等 <br />待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。 <br />可是使用Select就可以完成非阻塞(所谓非阻塞方式non- <br />block,就是进程或线程执行此函数转载 2010-11-04 21:18:00 · 1015 阅读 · 0 评论 -
关于Linux系统调用,内核函数
<br /><br />早上听人说到某个程序的一部分是内核态,另一部分是用户态,需要怎么怎么。当时突然想知道,用户的程序可以直接调用内核函数吗?(现在突然发觉这问题有点可笑,若是可以随便调,那系统岂不是乱套了)从网上找到下面这篇文章,讲的还算透彻。<br />现在自己的理解是,用户程序不可用直接调用内核函数,除非通过系统调用接口。如果想调用哪个内核函数(或自己写的内核函数),怎么办?增加一个系统调用就行了。<br />原文如下:<br />Linux系统调用<br /> 顾名思意,系统调用说的是操作系统原创 2010-11-04 21:00:00 · 13428 阅读 · 5 评论 -
mmap函数
<br />最近在看一本书是看到了这个函数,书中没有讲解这个函数的用法,就上网查了下,先放到下面,方便以后查阅。<br />功能描述: <br />mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。 <br />基于文件的映射,在mmap和munmap执行过程的任何时刻,被映射文件的st_atime可能被更新。如果st_atime字段在前述的情况下没有得到更新,首次对映原创 2010-10-30 22:35:00 · 1332 阅读 · 0 评论 -
linux里命令pkg-config工具的使用
<br /><br />一、编译和连接<br /> 一般来说,如果库的头文件不在 /usr/include 目录中,那么在编译的时候需要用 -I 参数指定其路径。由于同一个库在不同系统上可能位于不同的目录下,用户安装库的时候也可以将库安装在不同的目录下,所以即使使用同一个库,由于库的路径的 不同,造成了用 -I 参数指定的头文件的路径也可能不同,其结果就是造成了编译命令界面的不统一。如果使用 -L 参数,也会造成连接界面的不统一。编译和连接界面不统一会为库的使用带来麻烦。<br /> 为了解决编译和连接转载 2010-12-04 17:32:00 · 710 阅读 · 0 评论 -
由关于malloc的一个争论引起的探究
前几天,在听一节课时,关于malloc返回的地址是物理地址还是线性地址,跟人进行了激烈的讨论。当时脑子也不知怎么了,硬是觉得返回的是物理地址,还写了一个程序进行验证。#include #include int main(){char * p = (char *)malloc(sizeof(char));printf("address=%x/n",p);return 0;}我的理由是连续运行多次这个程序,每次输出的地址并不相同(我当时认为线性地址的话,每次输出地应该是一样的),然后又怎么怎么着。跟那人进行了激原创 2010-10-12 21:05:00 · 5878 阅读 · 22 评论 -
ubuntu中vim的设置
1、安装vimLUPA开源社区0I;MENDf sudo apt-get install vim-fullp HU-]+y^1513922、配置文件的位置在目录 /etc/ vim下面,有个名为vimrc的文件,这是系统中公共的vim配置转载 2009-07-11 10:18:00 · 945 阅读 · 0 评论 -
网络编程基础--非阻塞套接字
1.非阻塞网络程序--服务器端由于套接字是一种特殊的文件,因此,可以使用更改文件阻塞状态的方法修改套接字的阻塞状态。当套接字被设置为非阻塞状态时,如果对数据暂不可用的套接字进行读写操作,读写函数会返回-1,并置errno为EAGAIN,表示当前数据不可用。下例同样演示大小写字母转换的程序。//server.c#include #include #include原创 2009-08-19 16:09:00 · 1363 阅读 · 0 评论 -
网络编程基础--入门准备
1.字节序#include定义函数 unsigned short int htons(unsigned short int hostshort);函数说明 htons()用来将参数指定的16位hostshort转换成网络字符顺序。返回值 返回对应的网络字符顺序。#include定义函数 unsigned long int htonl(unsigned long原创 2009-08-18 19:36:00 · 1526 阅读 · 0 评论 -
网络编程进阶--非网络通信套接字
1.非命名UNIX域套接字linux下环境下使用socketpair函数创造一对未命名的,相互连接的UNIX域套接字:#include int socketpair(int domain,int type,int protocol,int sockfd[]); 第一个参数用于表示创建的套接字的域,本地进程通信时,用AF_UNIX。第二个参数表示要创建的套接字的类型,因为原创 2009-08-19 16:52:00 · 1268 阅读 · 0 评论 -
网络编程进阶--套接字深入编程
1.bind函数的作用客户端调用connect函数时由内核负责为其套接字绑定绑定地址和端口,服务器程序也可以在调用listen函数时,由内核自动绑定套接字。但是二者也有区别,connect函数使用一个设置好的地址结构作为参数,结构中绑定了服务器的IP地址和端口号。但是listen函数没有这个参数,所以listen函数不能使用设置好的地址结构,只能有系统设置IP地址和端口号。服务器端原创 2009-08-19 16:10:00 · 771 阅读 · 0 评论 -
IO端口和IO内存
驱动程序编写过程中,很少会注意到IO Port和IO Mem的区别。虽然使用一些不符合规范的代码可以达到最终目的,这是极其不推荐使用的。结合下图,我们彻底讲述IO端口和IO内存以及内存之间的关系。主存16M字节的SDRAM,外设是个视频采集卡,上面有16M字节的SDRAM作为缓冲区。1. CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立编址,也转载 2011-10-27 22:25:17 · 771 阅读 · 0 评论 -
Linux内核一个模块调另一个模块的函数
前几天,需要在一个内核模块A中添加一个新功能。这个新功能用到了另一个内核模块B中的函数C。我将相关的头文件include之后,加载A模块时,总是出错,说用到的那个函数C找不着。 怎么回事?以前没接触过内核编程的,找了个小牛问了一下,原来是Linux2.6内核不会自动的将非static 函数和变量导入到kernel 空间,需要用到EXPORT_SYMBOL来对函数做一下标记才行。 /* i原创 2011-11-12 14:02:29 · 7466 阅读 · 0 评论 -
linux获取系统启动时间
1、前言 时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同。linux内核里面用一个名为jiffes的常量来计算时间戳。应用层有time、getdaytime等函数。今天需要在应用程序获取系统的启动时间,百度了一下,通过sysinfo中的uptime可以计算出系统的启动时间。2、sysinfo结构 sysinfo结构保持了系统启动后的信息,主要转载 2014-09-11 19:52:22 · 3131 阅读 · 0 评论 -
从select的一个死循环谈epoll的ET模式
最近写程序遇到一个问题,就是发现select监听标准输出的时候遇到了死循环,具体程序如下程序一。程序的意图是每当用户在控制台有任何输入,就输出”hello world!”。程序一:#include #include #include #include int main(int argc, char *argv[]){ int maxfdp1;c转载 2014-05-14 09:06:53 · 1082 阅读 · 0 评论 -
Linux串口编程详解
串口本身,标准和硬件 ?串口是计算机上的串行通讯的物理接口。计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备。虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代;而原来用以连接网络的串口则被以太网替转载 2014-05-14 09:21:06 · 31131 阅读 · 2 评论 -
多层目录Makefile
今天结合网上的一个例子,自己写了一个可适用于多层目录的Makefile。ARCH= armv5l-linux-CC= $(ARCH)gcc LD = $(ARCH)ld AS = $(ARCH)as CPP = $(ARCH)g++ AR = $(ARCH)ar CFLAGS= -g -O2 -D_GNU_SOURCE -DHAVE_CONFIG_H L原创 2014-02-18 16:35:46 · 2642 阅读 · 0 评论 -
Linux环境变量的设置和查看方法
1. 显示环境变量HOME $ echo $HOME /home/redbooks 2. 设置一个新的环境变量hello $ export HELLO="Hello!" $ echo $HELLO Hello! 3. 使用env命令显示所有的环境变量 $ env HOSTNAME=redbooks.safe.org PVM_RSH=/us转载 2014-02-18 16:32:14 · 655 阅读 · 0 评论 -
SO_BINDTODEVICE 套接口选项
1. 起因事情的起因是我准备用两个CDMA modem来拓展点对点连接的带宽,并且希望藉此实现两个modem之间的负载均衡。但是不幸的是,联通公司的接入设备不支持Multilink-PPP。于是,没有办法,我只好自己来实现负载均衡。实现负载均衡的办法有几种,网络上给出的一种办法是采用iproute2来完成包级别的负载均衡,这是在内核一级实现的。但是我并不想把一切都交给内核去完成,我希望能够自己转载 2014-02-07 16:46:55 · 2082 阅读 · 0 评论 -
适用于多级目录的Makefile(还没试试,改天用了如果有问题,再修改)
开发中常常有这样的需求:一个不算简单的目录结构,需要一个统一的Makefile来进行编译管理。这时候最简单的做法就是遍历--搜罗所有的头文件和代码文件,使用统一的规则gcc -Ixx -o *.o *.c然后打扫战场,处理尸体;最标准的做法就是在每个子目录下编程时随手加上Makefile, 然后再百川归海,有统一的父目录(确切的说是始祖)Makefile来遥控, 但是,,,,你不觉得烦吗?转载 2014-01-28 16:57:22 · 944 阅读 · 0 评论 -
如何编写一个可靠的linux守护进程
linux服务端程序都需要提供7 * 24不间断的服务,如何保证工作进程一直不退出或者不被kill掉,常见的方法就是启动一个守护进程来检测工作进程的状态,如果发现工作进程退出,就再fork一个出来。一般的实现见下面一段代码:C代码 // 守护进程(父进程) int status; for ( ; ; ) { if ( 0 == ( pid = fork转载 2014-01-08 18:58:33 · 1303 阅读 · 0 评论 -
处理僵尸进程导致的后遗症
前段时间需要僵尸进行,通过在程序中调用 signal(SIGCHLD, SIG_IGN); 搞定啦。 但是,这么一来导致了好多问题。比如,通过system()函数调用什么命令时,明明命令正常执行了,system函数却返回-1.等等类似的问题。waitpid也会出错。分析了一下,应该是对SIGCHLD进行了忽略导致的。 怎么办?难懂不处理SIGCHLD信号了?那当然不行。原创 2013-12-12 16:16:53 · 1020 阅读 · 0 评论 -
linux out of memory分析
Linux Out-of-Memory(OOM) Killer Linux有一个特性:OOM Killer,一个保护机制,用于避免在内存不足的时候不至于出现严重问题,把一些无关的进程优先杀掉,即在内存严重不足时,系统为了继续运转,内核会挑选一个进程,将其杀掉,以释放内存,缓解内存不足情况,不过这种保护是有限的,不能完全的保护进程的运行。 在很多情况下,经常会看到还有剩转载 2013-12-04 12:10:05 · 1377 阅读 · 0 评论 -
僵尸进程
工作中,一个模块出现了僵尸进程,大致一看应该是system调用引起的。搜了一下僵尸进程的处理。一、僵屍進程的産生当子进程比父进程先运行结束,而父进程没有回收子进程的时候,子进程将成为一个僵尸进程。如果父进程先退出,子进程被init接管,子进程退出后init会回收,就没事了。二、僵屍進程的危害僵尸进程是一个运行完毕的进程,所有资源都已经释放了,除了它的进程表项。因原创 2013-11-15 10:55:02 · 1014 阅读 · 0 评论 -
Git使用
工作需要,研究了一段时间的git。 至于什么是index,是什么是working base, 什么是commit完了的东东,这些就不谈了。 只是将一些常用命令给记下来,方便以后参考。1.基本操作$git init #初始化一个代码库$git add . #将改动的东西加到index中,.指当前目录及子目录,也可用具体的文件名代替$git commit #原创 2012-11-03 22:06:22 · 1748 阅读 · 0 评论 -
socket IPC(转)
socket IPC与一般网络通信一致,也有两种类型sock_stream 和sock_daram不同的地方在于:1.网络通信server端以IP/Port作为服务名,IPC则以socket文件路径名作为服务名,socket文件与一般文件不同,socket文件是在程序运行时创建,而不能手动创建。2.Domain不同,一个是AF_INET,一个是AF_UNIX;使用的地址结构不同,一转载 2012-11-08 22:19:21 · 774 阅读 · 0 评论 -
UNIX Domain Socket IPC(转)
socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个转载 2012-11-08 22:23:55 · 633 阅读 · 0 评论 -
谁说vim不是IDE(转)
Vim以简洁的方式提供了丰富的配置功能,主要配置体系由一个文件和文件夹组成。在一台安装了Vim的OS X/Linux/Unix机器上,进入用户主目录,可以找到.vimrc文件和.vim文件夹,这就是Vim所有的配置信息。(1).vimrc介绍用户目录下的.vimrc文件就是Vim针对当前用户的主配置文件,该文件不是必备的,没有的话就创建它。文件位于当前用户的主目录下,可以用~/.v转载 2012-11-03 21:18:53 · 852 阅读 · 0 评论 -
Git的Patch功能(转)
UNIX世界的软件开发大多都是协作式的,因此,Patch(补丁)是一个相当重 要的东西,因为几乎所有的大型UNIX项目的普通贡献者,都是通过 Patch来提交代码的。作为最重要的开源项目之一,Linux,也是这样的。普通开发者从软件仓库clone下代码,然后写入代码,做一个Patch, 最后用E-mail发给Linux Kernel的维护者就好了。Git最初作为Linux的版本控制工具,提供了透明转载 2012-11-03 21:22:25 · 724 阅读 · 0 评论 -
Linux中brk(),sbrk(),mmap(),malloc(),calloc()的异同
brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这一块分配的。如果这块空间不够,malloc函数族(realloc,calloc等)就调用sbrk函数将数据段的下界移动,sbrk函数在内核的管理下将虚拟转载 2012-05-18 19:14:33 · 3528 阅读 · 1 评论 -
基于流的I/O--文件操作
1.打开关闭流 #include 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。 mode有下列几种形态字符串: r 打开只读文件,该文件必须存在。 r+ 打开可读写的文件,该文件必须存在。 w 打开只写文件,原创 2009-08-16 16:46:00 · 978 阅读 · 0 评论 -
进程的工作目录
1.进程的工作目录 #include int chdir(char * pathname); //chdir.c#include #include #include #include #include int main(void){ int fd; char *p = "hello world/n"; /* 测试用的字符串原创 2009-08-15 15:16:00 · 3088 阅读 · 0 评论 -
进程间通信--共享内存
1.创建 #include int shmget(key_t key,size_t size,int flag); 当打开一个内存段时,参数size的值为0。 //ceate_shm.c#include #include #include #include #include #define BUFSZ 4096int main()原创 2009-08-11 15:21:00 · 752 阅读 · 0 评论