
linux C开发
hjs1122
这个作者很懒,什么都没留下…
展开
-
unix linux 文件锁
有三种不同的文件锁,这三种都是“咨询性”的,也就是说它们依靠程序之间的合作,所以一个项目中的所有程序封锁政策的一致是非常重要的,当你的程序需要和第三方软件共享文件时应该格外地小心。有些程序利用诸如 FIlENAME.lock的文件锁文件,然后简单地测试此类文件是否存在。这种方法显然不太好,因为当产生文件的进程被杀后,锁文件依然存在,这样文件也许会被永久锁住。UUCP中把产生文件的进程号PID存入文件,但这样做仍然不保险,因为PID的利用是回收型的。这里是三个文件锁函数:转载 2011-03-14 19:15:00 · 852 阅读 · 0 评论 -
Unix/Linux C静态库的使用
单独使用gcc的时候,不用考虑C_INCLUDE_PATH/CPLUS_INCLUDE_PATH/LIBRARY_PATH/LD_INCLUDE_PATH这些变量,但使用make的时候,就要显示地提供这些变量(如果必要)静态库的创建与操作:ar [drqtpmx] [options] archive.a object.o-d: 从静态库中删除文件objfile-r: 替换或插入objfile-q: quick append,加入objfile without checking-t:转载 2011-03-14 19:09:00 · 862 阅读 · 0 评论 -
undefined reference to `sqrt' 问题
<br />在gcc下用到数学函数,如sqrt。在gcc时要加上 -lm 参数,这样告诉编译器我要用到数学函数了 。<br />如:<br />gcc a.c -o a -lm转载 2011-03-14 00:09:00 · 1288 阅读 · 0 评论 -
用 GDB 调试程序
用 gdb 调试 GCC 程序 Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况.以下是 gdb 所提供的一些功能:它使你能监视你程序中变量的值.它使你能设置断点以使程序在指定的代码行上停止执行.它使你能一行行的执行你的代码. 在命令行上键入 gdb 并按回车键就可以运行 gdb了, 如果一切正常的话, gdb 将被启动并且你将转载 2011-02-18 09:35:00 · 663 阅读 · 0 评论 -
C语言中用scanf连续输入两个字符类型的问题
<br />昨天用C编程,遇到一个关于scanf的细节问题,假如运行如下程序:#include<stdio.h><br />int main()<br />{<br /> char ch1,ch2;<br /> printf("Input for ch1:/n");<br /> scanf("%c",&ch1);<br /> printf("ch1=%c/n",ch1);<br /> printf("Input for ch2:/n");<br /> scanf("%c",&转载 2011-02-16 10:58:00 · 15469 阅读 · 0 评论 -
Linux 下串口编程入门
<br />串口简介<br />串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采用一个 25 个脚的 DB25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号转载 2011-02-16 10:47:00 · 665 阅读 · 0 评论 -
Linux设备驱动程序之阻塞/非阻塞IO----等待对列
<br />十一过后..<br />小王也刚好即将大学毕业,现在要开始写简历,投简历,找工作了。<br />到了家工作单位,小王欣喜若狂,可再一看,心都凉了半截..<br />“咋了,小王,看你找工作,我都来了帮你大气,怕什么,不就人多点吗..”看着排到电梯口的长龙,我说(其实,我心里也害怕,可也不能说出来不是)。<br />“不是,你不知道,我并不怕面试上有问题,有你在,技术上还是问题吗,不相信自己还不相信你啊,我主要是怕连面试的机会都没有,你看那么多人,不知道要排到哪里去了,你说每年都这样,那些人力主管转载 2011-03-04 16:57:00 · 670 阅读 · 0 评论 -
linux c 信号量编程
信号量当我们在多用户系统,多进程系统,或是两者混合的系统中使用线程操作编写程序时,我们经常会发现我们有段临界代码,在此处我们需要保证一个进程(或是一个线程的执行)需要排他的访问一个资源。信号量有一个复杂的编程接口。幸运的是,我们可以很容易的为自己提供一个对于大多数的信号量编程问题足够高效的简化接口。我们在第7章的第一个例子程序中--使用dbm访问数据库--如果多个程序尝试同时更新数据库,那么数据将会被破坏。两个不同的程序要求两个不同的用户为数据库输入数据则没有问题;问题的本质就在于更新数据库原创 2011-03-03 19:39:00 · 2195 阅读 · 0 评论 -
linux-多线程-互斥锁在多进程共享
<br /> 1. #include <sys/stat.h> 2. #include <fcntl.h> 3. #include <sys/mman.h> 4. #include <unistd.h> 5. 6. 7. #include <pthread.h> 8. #include <stdio.h> 9. #include <stdlib.h> 10. 11. 12转载 2011-03-03 18:36:00 · 2864 阅读 · 0 评论 -
如何用ftok来产生相关的key_t值
在System V中,我们经常用用key_t的值来创建或者打开信号量,共享内存和消息队列。这个在IPC的环境中十分的重要,比如说,服务器创建了一个消息队列,等待客户机发送请求。那么如何创建或者打开已有的消息队列呢?一般而言,我们对于服务器使用的路径和项目id(proj_id)是已知的,所以客户机可以获取相同的key来打开 消息队列并进行操作。下面就是ftok的使用原型:<br /># include <sys/types.h><br /># include <sys/ipc转载 2011-03-03 15:08:00 · 564 阅读 · 0 评论 -
ftok的陷阱
根据pathname指定的文件(或目录)名称,以及proj_id参数指定的数字,ftok函数为IPC对象生成一个唯一性的键值。在实际应用中,很容易产生的一个理解是,在proj_id相同的情况下,只要文件(或目录)名称不变,就可以确保ftok返回始终一致的键值。然而,这个理解并非完全正确,有可能给应用开发埋下很隐晦的陷阱。因为ftok的实现存在这样的风险,即在访问同一共享内存的多个进程先后调用ftok函数的时间段中,如果pathname指定的文件(或目录)被删除且重新创建,则文件系统会赋予这个同名转载 2011-03-03 15:14:00 · 644 阅读 · 0 评论 -
INI配置文件的格式
为什么要用INI文件?如果我们程序没有任何配置文件时,这样的程序对外是全封闭的,一旦程序需要修改一些参数必须要修改程序代码本身并重新编译,这样很不好,所以要用配置文件,让程序出厂后还能根据需要进行必要的配置;配置文件有很多如INI配置文件,XML配置文件,还有就是可以使用系统注册表等。 本文主要是为读者在实现读写INI配置文件模块之前,提供有关INI文件的格式信息。在早期的windows桌面系统中主要是用INI文件作为系统的配置文件,从win95以后开始转向使用注册表,但是还有转载 2011-02-21 14:10:00 · 513 阅读 · 0 评论 -
利用XML序列化实现程序配置文件
<br /> 有些应用程序在退出的时候,会将一些设置值写入到文件里,以便下次程序启动时调用,这个文件统称为配置文件。例如:Windows的扫雷程序,在每次启动的时候,都会出现在上次关闭的位置,就是因为扫雷程序在退出的时候将当前位置写入到配置文件里。<br /> 早期的配置文件的实现有两种方法。一是INI文件,在Win32的API中还专门有读写INI文件的API函数;另一个是注册表,这也是很多程序的首选,在版本较新的扫雷程序就是利用注册表实现配置函数。不过,上述的两种方法都有其的局限性。INI文件,结转载 2011-02-21 14:18:00 · 862 阅读 · 0 评论 -
dlmalloc源码
//头文件/** Default header file for malloc-2.8.x, written by Doug Lea and released to the public domain, as explained at http://creativec原创 2011-07-21 10:53:52 · 2147 阅读 · 0 评论 -
gcc 生成库
假设当前目录下有这些源文件:[main.c func.c func.h],其中main.c要调用func.c中的函数。【1】生成静态库:$ gcc -c func.c -o func.o$ ar rcs libfunc.a func.o$ gcc main.c -o原创 2011-07-21 10:31:39 · 593 阅读 · 0 评论 -
Linux中调用 system的返回值
先写一个被调用的函数#include #include #include #include int main(){printf("Return 10./n");return 10;} ==================================编译后生成一个"rt"的可执行文件运行结果=================================转载 2011-06-29 15:58:00 · 2377 阅读 · 0 评论 -
时钟滴答(clock tick)
请问时间的嘀嗒数是根据什么来设定的有必要明确一些Linux内核时钟驱动中的基本概念。 (1)时钟周期(clock cycle)的频率:8253/8254 PIT的本质就是对由晶体振荡器产生的时钟周期进行计数,晶体振荡器在1秒时间内产生的时钟脉冲个数就是时钟周期的频率。Linux用宏 CLOCK_TICK_RATE来表示8254 PIT的输入时钟脉冲的频率转载 2011-06-28 17:16:00 · 4712 阅读 · 0 评论 -
C/C++中的日期和时间 TIME_T与STRUCT TM转换
摘要:本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元)1.概念在C/C++中,对字符原创 2011-06-27 16:29:00 · 481 阅读 · 0 评论 -
fileno函数与ftruncate函数
<br />fileno()函数<br />功 能:把文件流指针转换成文件描述符<br />相关函数:open, fopen<br />表头文件:#include <stdio.h><br />定义函数:int fileno(FILE *stream)<br />函数说明:fileno()用来取得参数stream指定的文件流所使用的文件描述词<br />返回值 :返回和stream文件流对应的文件描述符。如果失败,返回-1。<br />范例:<br />#include <s转载 2011-03-21 13:54:00 · 893 阅读 · 0 评论 -
Linux下select函数的使用
一.Select 函数详细介绍 Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。 可是使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数转载 2011-03-16 12:20:00 · 700 阅读 · 0 评论 -
linxu select 返回值
<br />#include <sys/types.h>#include <sys/socket.h>#include <string.h>#include <netinet/in.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#define BUFFER 800#define SERV_PORT 3333int main(){ int sockfd,n; socklen_t le转载 2011-03-16 11:44:00 · 1104 阅读 · 0 评论 -
时钟周期及秒(s) 毫秒(ms) 微秒(μs) 纳秒(ns) 皮秒(ps)之间转换
<br />时钟周期是一个时间的量,人们规定10纳秒(ns)为一个时钟周期。时钟周期表示了SDRAM所能运行的最高频率。更小的时钟周期就意味着更高的工作频率。对于PC100规格的内存来说,它的运行时钟周期应该不高于10纳秒。纳秒与工作频率之间的转换关系为:1000 / 时钟周期 = 工作频率。例如,标称10纳秒的PC100内存芯片,其工作频率的表达式就应该是1000 / 100 = 100MHZ,这说明此内存芯片的额定工作频率为100MHZ。目前市场上一些质量优秀的内存通常可以工作在比额定频率高的频率下,这转载 2011-02-24 10:00:00 · 31774 阅读 · 0 评论 -
不要做浮躁的嵌入式系统工程师
<br /> 每天读一遍,思考一下:我是否浮躁?<br /> <br />1、不要看到别人的回复,第一句话就说:给个代码吧!你应该想想为什么。当你自己想出来再参考别人的提示,就会知道自己和别人思路的差异。<br /> <br />2、初学者请不要看太多的书,那会误人子弟的,先找一本好书系统的学习。很多人用了很久都是只对部分功能熟悉而已,不系统还是不够的。<br /> <br />3、看帮助。不要因为很难,而自己又是初学者所以就不看。帮助永远是最好的参考手册,虽然帮助的文字有时候很难看懂,或不够直观转载 2011-02-11 16:46:00 · 1307 阅读 · 2 评论 -
Linux环境进程间通信: 共享内存(下)
<br />系统调用mmap()通过映射一个普通文件实现共享内存。系统V则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信。也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件(这是通过shmid_kernel结构联系起来的),后面还将阐述。<br />1、系统V共享内存原理<br />进程间需要共享的数据被放在一个叫做IPC共享内存区域的地方,所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间中去。系统V共享内存通过shmget获得或创建一个IPC共享内存区域,并返转载 2011-03-03 11:30:00 · 641 阅读 · 0 评论 -
Josephus 排列问题
<br />Josephus 排列问题定义如下:假设 n 个竞赛者排成一个环形。给定一个正整数 m,从某<br />个指定的第 1 个人开始,沿环计数,每遇到第 m 个人就让其出列,且计数继续进行下去。这<br />个过程一直进行到所有的人都出列为止。 最后出列者为优胜者。 每个人出列的次序定义了整<br />数 1,2,...,n 的一个排列。这个排列称为一个(n,m)Josephus<br /><br />利用c++中的list来做 实验文件夹内容(input.txt):<br />5原创 2010-11-21 16:48:00 · 1583 阅读 · 0 评论 -
vim c++ stl 全能补全
<br />1. Install OmniCppComplete. See its doc/omnicppcomplete.txt file for information.<br />2. Make a directory, for example ~/.vim/tags that will hold your ctags.<br />3. Create stdc++ tags: Download and unpack the modified libstdc++ headers to ~/.vim/ta转载 2010-11-21 16:33:00 · 1668 阅读 · 0 评论 -
11个经典的Apache开源项目
<br />1、Apache Web Server Apache HTTP Server项目<br />Apache HTTP Server项目主要致力于为现代操作系统开发和维护开源的HTTP服务器,其中包括Unix和Windows NT。这个项目的主要目标是提供一个可以与当前的HTPP标准同步提供安全、高效和可扩展的服务器的HTTP服务。<br />自1996年4月以来,Apache就变成了互联网上最流行的Web服务器。<br />主要用户群:连续13年,Apache HTTP服务器都是全球Web服务器的转载 2010-11-21 16:23:00 · 6610 阅读 · 0 评论 -
my vimrc
<br />set helplang=cn <br />set guioptions-=r<br />set guioptions -=T<br />syntax enable <br />syntax on<br />set cursorline<br />set nobackup<br />set noswapfile<br />set wildmenu <br />colorscheme torte <br />set hls<br />let Tlist_原创 2010-11-22 12:27:00 · 526 阅读 · 0 评论 -
algorithm 函数表 C++
<br />accumlate :iterator对标志的序列中的元素之和,加到一个由init指定的初始值上。重载的版本不再做加法,而是传进来的二元操作符被应用到元素上。<br />adjacent_different:创建一个新序列,该序列的每个新值都代表了当前元素与上一个元素的差。重载版本用指定的二元操作计算相邻元素的差。<br />adjacent_find:在iterator对标志的元素范围内,查找一对相邻的重复元素,如果找到返回一个ForwardIterator,指向这对元素的第一个元素。否则返回转载 2010-11-21 16:34:00 · 554 阅读 · 0 评论 -
最优车皮排序问题
#include #include #include #include using namespace std;int main(int argc, char *argv[]){int flog = 1; //用flog表示可以直接输出的车皮号 开始的时候是1 当每次直接输出了之后 要加1int n = 0; //n表示总共的车皮数量list objbegin; //用来存放初始的a1,a2,---,anifstream fin("input.txt", ios::in); //打开读取的文件;fin原创 2010-11-21 16:31:00 · 741 阅读 · 1 评论 -
ourhead.h
<br />/*Our own header, to be included after all standard system headers*/<br />#ifndef __ourhdr_h <br />#define __ourhdr_h <br />#include <errno.h>/*for definition of errno */<br />#include <stdarg.h>/*ANSI C header file*/<br />#include <sys/转载 2010-11-21 16:28:00 · 641 阅读 · 0 评论 -
如何查看linux命令源代码
<br />用linux一段时间了,有时候想看看ls、cat、more等命令的源代码,在下载的内核源码中用cscope没能找到,在网上搜索了一下,将方法总结如下:以搜索ls命令源码为例,先搜索命令所在包,命令如下:<br />lpj@lpj-linux:~$ which ls<br />/bin/ls<br />用命令搜索该软件所在包,代码如下:<br />lpj@lpj-linux:~$ dpkg -S /bin/ls<br />coreutils: /bin/ls<br />从上一步中可以知道ls命令的转载 2010-11-21 16:25:00 · 631 阅读 · 0 评论 -
如何查看linux命令源代码
<br />用linux一段时间了,有时候想看看ls、cat、more等命令的源代码,在下载的内核源码中用cscope没能找到,在网上搜索了一下,将方法总结如下:以搜索ls命令源码为例,先搜索命令所在包,命令如下:<br />lpj@lpj-linux:~$ which ls<br />/bin/ls<br />用命令搜索该软件所在包,代码如下:<br />lpj@lpj-linux:~$ dpkg -S /bin/ls<br />coreutils: /bin/ls<br />从上一步中可以知道ls命令的转载 2010-11-21 16:25:00 · 462 阅读 · 0 评论 -
汉字字符害死人-vim c开发
<br />main.c:10: error: stray '/342' in program<br />main.c:10: error: stray '/200' in program<br />main.c:10: error: stray '/234' in program<br />main.c:10: error: expected expression before '/' token<br />main.c:10: error: stray '/342' in program转载 2010-11-20 11:13:00 · 632 阅读 · 0 评论 -
C/C++ 标准输入输出重定向
<br />这个对经常在OJ上做题的童鞋们很有用。OJ基本都是用标准输入输出(USACO除外)。但如果你在调试的时候也都是从控制台输入,那就太浪费宝贵的时间了。我们可以重定向标准输入,调试的时候从文件读,提交时从标准输入读。<br />在C语言中,方法比较简单。使用函数freopen():<br />freopen("data.in","r",stdin);freopen("data.out","w",stdout);<br />这样就把标准输入重定向到了data.in文件,标准输出重定向到了dat转载 2011-01-10 19:33:00 · 1662 阅读 · 0 评论 -
vim设置字体
<br />在Linux下设置字体的命令是: <br />:set guifont=Courier/ 14 <br />而在Windows下则是: <br />:set guifont=Courier:14 <br />当然,如果需要设置多个字体,则我们可以在各个字体之间添加逗号(,)来设置多个字体,如: <br />:set guifont=Courier/ New/ 12, Arial/ 10<br /><br />如果不知道是那种字体到的话 可以通过:set guifont 来转载 2010-11-22 12:18:00 · 18741 阅读 · 0 评论 -
man c 函数 安装 使用
<br /># man 2 select<br />No manual entry for select in section 2<br /># man 3 select<br />No manual entry for select in section 3<br />可见2,3都没有,增加此项目,使用命令:<br />#apt-get install manpages-dev<br />#apt-get install manpages-posix-dev<br />安装完毕转载 2010-11-22 12:25:00 · 587 阅读 · 0 评论 -
Linux环境进程间通信: 共享内存(上)
<br />采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才转载 2011-03-03 10:53:00 · 553 阅读 · 0 评论 -
shmget() -- 建立共享内存
<br />#include <sys/ipc.h>#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);<br /><br />key_t key<br /> key标识共享内存的键值: 0/IPC_PRIVATE。 当key的取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存;如果key的取值为0,而参数shmflg中设置了IPC_PRIVATE这个标志,则同样将创建一块转载 2011-03-03 15:55:00 · 751 阅读 · 0 评论 -
使用共享内存实现进程间通信 shmget shmat shmctrl shmdt
共享内存的函数有以下几个:(1)int shmget(key_t key, int size, int shmflg),开辟或使用一块共享内存。(2)void *shmat(int shmid, const void *shmaddr, int shmflg), 将参数shmid所指向的共享内存与当前进程连接。当使用某共享内存时,需要先使用shmat,达成连接。(3)int shmdt(const void *shmaddr),将先前用shmat连接的共享内存与当前进程解除连接。参数shmaddr为shma转载 2011-03-03 14:32:00 · 1001 阅读 · 0 评论