linux编程
hnsncxy
为之疯狂
展开
-
为什么需要字节对齐
概念 在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然边界(alignment)分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。为了使CPU能够对变量进行快速的访问,变量的起始地址应该转载 2016-12-30 14:14:15 · 3586 阅读 · 0 评论 -
[Linux应用]通过sysfs在用户空间使用GPIO
通过使用sysfs,Linux GPIO可以支持在用户空间进行GPIO的控制或获取状态。这样可以使用简单的工具,比如“echo”来设置输出GPIO的电平或使用“cat”来读取输入GPIO的当前值。1、配置内核中sysfs下的GPIO支持 要想在用户空间访问GPIO,需要在sysfs中使能GPIO支持。Symbol: GPIO_SYSFS [=n] Type : bo转载 2014-09-24 23:47:36 · 2651 阅读 · 0 评论 -
getchar 和 getch区别
getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的get转载 2014-05-18 17:58:57 · 7883 阅读 · 0 评论 -
scanf(), getchar(), 以及gets(),空白符以及输入缓冲区的问题
--------------------------------------------------- | 问题描述一:(分析scanf()和gets()读取字符) | ---------------------------------------------------- scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时转载 2014-05-11 15:03:55 · 7216 阅读 · 2 评论 -
使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
通过fcntl设置FD_CLOEXEC标志有什么用? close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述符被关闭,不能再使用它,但是在使用fork调用的子进程中,此描述符并不关闭,仍可使用。 通过fcntl设置FD_CLOEXEC标志有什么用? close on exec, not on-转载 2014-05-07 01:08:31 · 5689 阅读 · 1 评论 -
linux多线程中信号的使用(1)
在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别,可以说是完全不同。在进程环境中,对信号的处理是,先注册信号处理函数,当信号异步发生时,调用处理函数来处理信号。它完全是异步的(我们完全不知到信号会在进程的那个执行点到来!)。然而信号处理函数的实现,有着许多的限制;比如有一些函数不能在信号处理函数中调用;再比如一些函数read、recv等调用时会被异步的信号给中断(inter转载 2013-09-27 00:22:19 · 1599 阅读 · 0 评论 -
linux waitpid/wait函数用法
关于linux中waitpid函数的一些使用说明:#includesys/types.h> #include 定义函数 pid_t waitpid(pid_t pid,int * status,int options);waitpid函数有三个参数:pid和指向返回状态所在单元的指针和一个用来指定可选项的标识符。如果pid为-1 ,waitpid就等待任转载 2014-05-05 00:00:04 · 2432 阅读 · 0 评论 -
linux 日志logger
一 通过logger命令记录日志logger 是一个shell 命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。日志的级别facility: auth -用户授权 authpriv -授权和安全 cron -计划任务:at ,cron daemon -系统守护进程转载 2014-03-17 22:34:50 · 10384 阅读 · 0 评论 -
netlink---Linux下基于socket的内核和上层通信机制
需要在linux网卡驱动中加入一个自己的驱动,实现在内核态完成一些报文处理(这个过程可以实现一种零COPY的网络报文截获),对于复杂报文COPY下必要的数据交给用户态来完成(因为过于复杂的报文消耗CPU太大,会导致中断占用时间太长)。因此需要一种内核和用户态配合的通信机制,尝试了很多方式都不太理想,最后采用netlink+内存映射的模式很好的解决了这个问题。Netlink是一种采用socket通信转载 2013-12-10 11:12:54 · 1255 阅读 · 0 评论 -
linux多线程中信号的使用(2)
简介: 关于代码的可重入性,设计开发人员一般只考虑到线程安全,异步信号处理函数的安全却往往被忽略。本文首先介绍如何编写安全的异步信号处理函数;然后举例说明在多线程应用中如何构建模型让异步信号在指定的线程中以同步的方式处理。Linux 多线程应用中编写安全的信号处理函数在开发多线程应用时,开发人员一般都会考虑线程安全,会使用 pthread_mutex 去保护全局变量。如果应用中转载 2013-09-27 00:24:57 · 986 阅读 · 0 评论 -
Makefile编译目录下多个文件以及函数wildcard用法
编译多个c文件一般有两个功能,一个是每个c文件都有main函数,就是说每个c文件的可执行文件是独立的,各自是各自的;第二个是多个c文件用来编译成一个可执行文件。首先说第一个,内容如下,这个makefile是为了编译opencv代码的。[cpp] view plaincopyCFLAGS= -g -O3 `pkg-config转载 2013-09-30 19:15:09 · 25014 阅读 · 1 评论 -
linux 获取系统 页大小
1、编写测试程序 2、查看运行jie原创 2014-09-16 16:03:03 · 5404 阅读 · 0 评论 -
shell编程——select语句
select 表达式是一种bash的扩展应用,动作包括: 自动用1,2,3,4列出菜单 (没有echo指令,自动显示菜单) 自动read输入选择 (没有 read指令,自动输入) 赋值给变量 (没有赋值指令,自动输入数字后,赋值字符串给变量) select典型例子[macg@machome ~]$ vi test.shecho "What转载 2015-02-07 23:47:02 · 4607 阅读 · 0 评论 -
X11 FRAMEBUFFER QT
之前对X11 FRAMEBUFFER理解的不够,现在总结一下QtEmbedded是挪威Trolletch公司的图形化界面开发工具Qt的嵌入式版本,它通过QtAPI与LinuxI/O以及Framebuffer直接交互,拥有较高的运行效率,而且整体采用面向对象编程,拥有良好地体系架构和编程模式。Qt/Embedded在原始Qt的基础上,做了许多出色的调整以适合嵌入式环境。同Qt/X11相比转载 2015-04-18 13:25:49 · 2080 阅读 · 0 评论 -
深入理解TAILQ队列
工作的主要内容是tcp/ip,平台是FreeBSD,而且在内核态开发,所以很多情况下会涉及内核的一些数据结构和宏,比如说mbuf和TAILQ等。 TAILQ是FreeBSD/linux内核对双向队列操作的一种抽象,抽象程度不亚于C++,能实现操作队列需要的各种操作:插入元素,删除元素,遍历队列等。这个队列的优点是插入元素很快。 这里先回顾一下队列的特点(来自维基百科 http://zh.wik转载 2013-03-07 23:44:47 · 23724 阅读 · 11 评论 -
循环结构中break、continue、return和exit的区别
1. breakbreak语句的使用场合主要是switch语句和循环结构。在循环结构中使用break语句,如果执行了break语句,那么就退出循环,接着执行循环结构下面的第一条语句。如果在多重嵌套循环中使用break语句,当执行break语句的时候,退出的是它所在的循环结构,对外层循环没有任何影响。如果循环结构里有switch语句,并且在switch语句中使用了break语句,当执行swi转载 2012-10-23 10:43:22 · 105978 阅读 · 17 评论 -
linux程序分析工具介绍-ldd,nm
转载自: http://www.wuzesheng.com/?p=1595本文要介绍的ldd和nm是linux下,两个用来分析程序很实用的工具。ldd是用来分析程序运行时需要依赖的动态库的工具;nm是用来查看指定程序中的符号表相关内容的工具。下面通过例子,分别来介绍一下这两个工具:1. ldd, 先看下面的例子, 用ldd查看cs程序所依赖的动态库:wuze转载 2016-09-01 16:13:08 · 1878 阅读 · 0 评论 -
C++ 类的静态成员详细讲解
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即::。 在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和转载 2016-08-22 17:06:39 · 612 阅读 · 0 评论 -
c语言 struct 的初始化
struct数据有3中初始化方法:顺序,C风格及C++风格的乱序。1)顺序 这种方法很常见,在一般的介绍C的书中都有介绍。顺序初始化的特点是: 按照成员定义的顺序,从前到后逐个初始化;允许只初始化部分成员;在被初始化的成员之前,不能有未初始化的成员。 eg: struct User oneUser = {10, "Lucy", "/home/Lucy"}; 2)乱序(C转载 2016-07-29 23:20:41 · 1488 阅读 · 0 评论 -
Makefile常用函数
在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能。make所支持的函数也不算很多,不过已经足够我们的操作了。函数调用后,函数的返回值可以当做变量来使用。一、函数的调用语法函数调用,很像变量的使用,也是以“$”来标识的,其语法如下: $()或是 ${}这里,就是函数名,make支持的函数不多。是函数的参数,参数间以逗转载 2016-05-25 15:29:29 · 595 阅读 · 0 评论 -
C\C++ sizeof 陷阱&&总结
C\C++ sizeof 陷阱&&总结今天使用动态数组,本来想通过sizeof 获取动态数据,结果出现了错误。先对自己做个测试,能做出下面这个题目,并做出合理解释,可以不用往下看了。View Code 示例来源于网络,参考解释如下:a是一个很奇怪的定义,他表示一个指向 double*[3][6]类型数组的指针。既然是指针,所以sizeof(a)就是4。(指针占用转载 2016-04-11 22:10:46 · 1779 阅读 · 0 评论 -
linux 程序存储结构
inux系统下,程序是一个可执行文件,通常是ELF格式。通常,Linux的可执行文件拥有两种内存分配方式:存储时 和 运行时1、存储时看实例,下面是对可执行文件aa运行size命令后得到的结果。[root@xxx1 algriom]# size aatext data bss dec hex filename1257 500 16 1773 6ed aa其中:text(转载 2016-04-12 23:44:58 · 655 阅读 · 0 评论 -
linux进程、调度、线程、进程上下文等几点理解
1、信号来自进程或内核2、线程共享进程的代码空间和数据空间(全局变量或静态变量),文件描述符,信号,以及malloc分配的内存,每个线程拥有独立的栈空间和程序计数器,在创建线程时,调用pthread_create函数的线程和新建线程的执行顺序随机3、在linux中,使用轻量级进程来模拟线程,线程操作的相关函数通过第三方线程库 (Linuxthreads 或 Native POS原创 2014-05-04 00:32:14 · 7674 阅读 · 2 评论 -
64bit 系统运行32bit软件兼容性问题,错误提示:libstdc++.so.6 not found
./INSTALL时,发现libstdc++.so.6 找不到。可是locate libstdc++.so.6 ,发现明明有的:$ locate libstdc++.so.6 /usr/lib/libstdc++.so.6/usr/lib/libstdc++.so.6.0.13于是。。。 先把 instcore 拿出来测试。vowstar@vowstar-desktop转载 2015-05-06 19:19:51 · 8379 阅读 · 0 评论 -
linux 线程总结
1、同一进程线程的共享资源a. 堆 由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;b. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的c. 静态变量虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的d. 文件等公用资源 这个是共享的,使用这些公共资源的线原创 2013-09-10 20:46:42 · 801 阅读 · 0 评论 -
linux套接字编程
套接字编程的各级要素:`主机接口:网络地址ip`协议:特定的协议(TCP & UDP)`端口:client或server的进程终点套接字简单的说,套接字就是两个应用程序之间通信管道的终点,这个管道可以唯一的标志一条链接,而应用程序则通过套接字来操作这个管道通信。通信过程要想使不同主机的进程通信,就必须使用套接字,套接字是用socket()函数创建,如果需要C/S转载 2013-08-18 14:41:41 · 6546 阅读 · 0 评论 -
fgets和fputs、fread和fwrite、fscanf和fprintf用法小结
字符串读写函数fgets和fputs一、读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针); 其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志”。例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入 字符数组str中。转载 2013-08-14 10:24:18 · 2091 阅读 · 0 评论 -
diff 和 patch 使用指南
diff和patch是一对工具,在数学上来说,diff是对两个集合的差运算,patch是对两个集合的和运算。 diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的patch文件,即补丁文件。 patch能将diff文件运用于 原来的两个集合之一,从而得到另一个集合。举个例子来说文件A和文件B,经过diff之后生成了补丁文件C,那么着个过程相当于 A转载 2012-09-26 15:45:18 · 1081 阅读 · 0 评论 -
网桥原理
简单来说,桥接就是把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。交换机就是这样一个设备,它有若干个网口,并且这些网口是桥接起来的。于是,与交换机相连的若干主机就能够通过交换机的报文转发而互相通信。如下图:主机A发送的报文被送到交换机S1的eth0口,由于eth0与eth1、eth2桥接在一起,故而报转载 2012-08-22 00:03:58 · 2660 阅读 · 0 评论 -
linux 中解析命令行参数 (getopt_long用法)
getopt_long支持长选项的命令行解析,使用man getopt_long,得到其声明如下: #include int getopt_long(int argc, char * const argv[], const char *optstring, const struct opti转载 2012-08-15 08:57:32 · 2038 阅读 · 0 评论 -
Soc名词解析
20世纪90年代中期,因使用ASIC实现芯片组受到启发,萌生应该将完整计算机所有不同的功能块一次直接集成于一颗硅片上的想法。这种芯片,初始起名叫System on a Chip(SoC),直译的中文名是系统级芯片。 如何界定SoC,认识并未统一。但可以归纳如下: ①SoC应由可设计重用的IP核组成,IP核是具有复杂系统功能的能够独立出售的VLSI块; ②IP核应采转载 2012-07-02 14:38:33 · 1880 阅读 · 0 评论 -
kill 命令的深度理解
kill 实际的实际作用是给进程发信号(signal), 其常用格式为kill -sig pid这里的 sig 可以是信号对应的数字,也可以是信号名,比如你如果用 kill -9 pid 实际是发 9号信号给进城,9对应的信号名是 KILL。所以 kill -9 等价于 kill -KILL pid。 常用的几个信号是INT 2 这个就是你在bash下面用Ctrl+C转载 2012-06-29 18:43:35 · 839 阅读 · 0 评论 -
理解进程
当运行任何一个UNIX命令时,shell至少会建立一个进程来运行这个命令,所以可以把任何在UNIX系统中运行的程序叫做进程;但是进程并不是程序,进程是动态的,而程序是静态的,并且多个进程可以并发的调用同一个程序。 系统中每一个进程都包含一个task_struct数据结构,所有指向这些数据结构的指针组成一个进程向量数组,系统缺省的进程向量数据大小是512,表示系统中可同时容纳512个进转载 2012-06-28 20:47:33 · 692 阅读 · 0 评论 -
linux进程与文件的权限
对于一个linux进程,它每次打开、创建或者删除一个文件时,内核就要对该进程进行文件访问权限测试,而在对具体某个文件进行测试时,还需要测试其对目录(也就是文件路径)进行权限测试。 比如要修改/usr/include/stdio.h,需要对/、/usr和/usr/include这三个目录进行权限测试,保证有对这三个目录的执行权限(执行权限用于打开该目录,读权限用于显示目录内容,写权限用转载 2012-06-28 17:23:36 · 1992 阅读 · 0 评论 -
linux 线程编程
Linux--线程编程进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段、代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换 线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, 比创建进程小很多 进程内独立的一条运行路线 处理器调度的最小单元,也称为轻量级进程可以对进程的内存空间和资源进行访问,并与同一转载 2012-06-21 17:32:00 · 413 阅读 · 0 评论 -
浅谈setjmp与longjmp
浅谈setjmp与longjmp 转在C语言中,用于跳转的goto语句,只能够用在同一个函数内部的跳转。而setjmp 与 longjmp的结合使用,却可以实现在不同程序之间的跳转。让我们先来看一下函数原型吧:#include int setjmp(jmp_buf env)Returns: 0 if called di转载 2012-06-20 15:12:34 · 429 阅读 · 0 评论 -
linux 系统调用跟踪---strace
strace命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。下面记录几个常用 option 1 -f -F选项告诉strace同时跟踪fork和vfork出来的进程 2 -o xxx.txt 输出到某个文件。 3 -e ex原创 2012-11-24 14:20:13 · 1232 阅读 · 0 评论 -
Linux下Fork与Exec使用
一、引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。与DOS和早期的Windows不同,Unix/Linu转载 2013-02-01 11:19:31 · 741 阅读 · 0 评论 -
函数指针参数传递问题
程序1: void myMalloc(char *s) //我想在函数中分配内存,再返回 { s=(char *) malloc(100); } void main() { char *p=NULL; myMalloc(p); //这里的p实际还是NULL,p的值没有改变,为什么?转载 2013-01-17 10:33:35 · 987 阅读 · 0 评论 -
堆栈内存分配 及 函数返回值问题
1、堆栈变量的区别与使用可能许多人对内存分配上的"栈 stack"和"堆 heap"还不是很明白。包括一些科班出身的人也不明白这两个概念。我不想过多的说这两个东西。简单的来讲,stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里。stack一般是静态分配内存,heap上一般是动态分配内存。由malloc系统函数分配的内存就是从堆上分配内存原创 2013-08-21 23:41:18 · 4216 阅读 · 0 评论