Linux基础编程
文章平均质量分 69
JoJo
Come on, don't give up, I would be successful.
展开
-
共享内存映射之mmap()函数详解
共享内存映射之mmap()函数详解 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,转载 2013-01-18 15:56:17 · 1381 阅读 · 0 评论 -
浅析Linux下core文件
当我们的程序崩溃时,内核有可能把该程序当前内存映射到core文件里,方便程序员找到程序出现问题的地方。最常出现的,几乎所有C程序员都出现过的错误就是“段错误”了。也是最难查出问题原因的一个错误。下面我们就针对“段错误”来分析core文件的产生、以及我们如何利用core文件找到出现崩溃的地方。何谓core文件当一个程序崩溃时,在进程当前工作目录的core文件中复制了该进程的存储图像。core转载 2012-07-30 16:47:58 · 1149 阅读 · 0 评论 -
LINUX最大线程数及最大进程数
查看最大线程数:cat /proc/sys/kernel/threads-maxulimitUser limits - limit the use of system-wide resources.Syntaxulimit [-acdfHlmnpsStuv] [limit]Options-S Change and report the soft limi转载 2012-07-30 16:14:42 · 1415 阅读 · 0 评论 -
gdb 多线程调试
http://hi.baidu.com/hcq11/blog/item/9f5bfc6e696209d680cb4a25.html http://hi.baidu.com/litto/blog/item/759389dd198111375882dd1e.html http://blogold.chinaunix.net/u3/94700/showart_2389432.html转载 2012-08-15 09:59:15 · 1479 阅读 · 0 评论 -
Linux中link,unlink,close,fclose函数详解
linux中每一个文件,都可以通过一个struct stat的结构体来获得文件信息,其中一个成员st_nlink代表文件的链接数。当通过shell的touch命令或者在程序中open一个带有O_CREAT的不存在的文件时,文件的链接数为1。通常open一个已存在的文件不会影响文件的链接数。open的作用只是使调用进程与文件之间建立一种访问关系,即open之后返回fd,调用进程可以通过fd来转载 2012-07-29 15:52:48 · 6149 阅读 · 0 评论 -
assert()函数用法总结
assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include assert.h>void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badp转载 2012-07-29 18:30:54 · 738 阅读 · 0 评论 -
关于main函数的三个参数
每一C 程序都必须有一main()函数, 可以根据自己的爱好把它放在程序的某个地方。有些程序员把它放在最前面, 而另一些程序员把它放在最后面, 无论放在哪个地方, 以下几点说明都是适合的。1. main() 参数在Turbo C2.0启动过程中, 传递main()函数三个参数: argc, argv和env。* argc: 整数, 为传给main()的命令行参数个数。* a转载 2012-08-12 15:29:01 · 9418 阅读 · 0 评论 -
inet_aton和inet_network和inet_addr三者比较
知识背景:210.25.132.181属于IP地址的ASCII表示法,也就是字符串形式。英语叫做IPv4 numbers-and-dots notation。如果把210.25.132.181转换为整数形式,是3524887733,这个就是整数形式的IP地址。英语叫做binary data。(其实binary是二进制的意思)问题所在:如何在字符串形式的IP和整数形式的IP之间转换呢转载 2012-08-11 12:23:04 · 991 阅读 · 0 评论 -
Socket的read和recv函数的区别
1、recv和send recv和send函数提供了和read和write差不多的功能.但是他们提供了第四个参数来控制读写操作。int recv(int sockfd,void *buf,int len,int flags)int send(int sockfd,void *buf,int len,int flags)前面的三个参数和read,write相同,第四个参数能够是0或转载 2012-07-23 11:04:41 · 1273 阅读 · 0 评论 -
Makefile详解
Makefile详解跟我一起写 Makefile概述——什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件转载 2012-08-06 00:05:55 · 872 阅读 · 0 评论 -
用gdb调试core dump文件
在Unix系统下,应用程序崩溃,一般会产生core文件,如何根据core文件查找问题的所在,并做相应的分析和调试,是非常重要的。什么是Core Dump?Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成,转载 2012-08-16 16:06:05 · 1346 阅读 · 0 评论 -
gprof——GNU性能分析工具
gprof介绍gprof是GNU profiler工具。可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。还可以显示“注释的源代码”,是程序源代码的一个复本,标记有程序中每行代码的执行次数。为gprof编译程序在编译或链接源程序的时候在编译器的命令行参数中加入“-p转载 2012-08-16 16:08:01 · 808 阅读 · 0 评论 -
系统什么时候发送SIGKILL信号
when does the system send SIGKLILL我的程序有时候会随机收到SIGKILL信号,gdb会提示:Program terminated with signal SIGKILL, Killed.The program no longer exists.(gdb)并且我找不到任何原因?什么时候系统会发送SIGKILL信号呢?我这里没有其他程序发送这个原创 2012-08-23 17:45:51 · 12280 阅读 · 0 评论 -
pselect()
很久以来,同事写的一个模块,与串口收发数据的时候,SELECT()函数等待的时间长点,就会被模块里设置的时钟信号打断,最近看到了一个新的函数pselect(),研究了一把,收获不小!!现在发现,SELECT()函数等待的这段时间内不想被别的信号打断的方法有两其一:用pselect()函数#include #include #include转载 2012-10-09 17:06:56 · 1154 阅读 · 0 评论 -
linux下 C编程改变输出字体颜色
格式: echo "\033[字背景颜色;字体颜色m字符串\033[0m"例如:echo "\033[41;36m something here \033[0m" 其中41的位置代表底色, 36的位置是代表字的颜色那些ascii code 是对颜色调用的始末. \033[ ; m …… \033[0m 字背景颜色范围:40----4940:黑41:深红42:绿转载 2012-09-19 10:53:35 · 6324 阅读 · 0 评论 -
Linux popen用法
popenLinux C 进程I/O函数,与pclose函数一起使用。表头文件 #include stdio.h>函数定义 FILE * popen ( const char * command , const char *type ); int pclose ( FILE * stream );函数说明 popen() 函数通过创建一转载 2012-09-18 10:35:44 · 1468 阅读 · 0 评论 -
linux exec的用法
说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是:#include extern char **environ;int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, .转载 2012-09-18 10:32:02 · 1094 阅读 · 0 评论 -
Linux自启动设置详解
前言 linux有自己一套完整的启动体系,抓住了linux启动的脉络,linux的启动过程将不再神秘。 阅读之前建议先看一下附图。 本文中假设inittab中设置的init tree为: /etc/rc.d/rc0.d /etc/rc.d/rc1.d /etc/rc.d/rc2.d /etc/rc.d/rc3.d /etc/rc.d/rc4.d转载 2012-09-17 19:40:28 · 732 阅读 · 0 评论 -
Linux下C/C++查找某一进程
一、前言:要在程序中启动某一程序,如果程序已经存在了,就不再启动。查找了N篇文档,有所收获,总结一下。二、实现大体分两种:1、exec或popen执行ps的命令行,然后运用某几个字符串匹配函数。#include stdio.h>#include unistd.h>#include string.h>#include signal.h>int main()转载 2012-09-18 10:37:21 · 2903 阅读 · 0 评论 -
线程的取消/撤销
1 线程取消的定义一般情况下,线程在其主体函数退出的时候会自动终止,但同时也可以因为接收到另一个线程发来的终止(取消)请求而强制终止。2 线程取消的语义1. 线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略(当禁止取消时)、或者立即终止(当在取消点或异步模式下)、或者继续运行至Cancelation-point(取消点,下面将描转载 2012-10-08 11:54:23 · 1392 阅读 · 0 评论 -
pthread_cleanup_push与pthread_cleanup_pop的目的(作用)
比如thread1:执行pthread_mutex_lock(&mutex);//一些会阻塞程序运行的调用,比如套接字的accept,等待客户连接sock = accept(......); //这里是随便找的一个可以阻塞的接口pthread_mutex_unlock(&mutex);这个例子中,如果线程1执行accept时,线程会阻塞(也就是转载 2012-10-08 11:50:07 · 2670 阅读 · 0 评论 -
tcp socket的发送与接收缓冲区
(1)应用程序可通过调用send(write, sendmsg等)利用tcp socket向网络发送应用数据,而tcp/ip协议栈再通过网络设备接口把已经组织成struct sk_buff的应用数据(tcp数据报)真正发送到网络上,由于应用程序调用send的速度跟网络介质发送数据的速度存在差异,所以,一部分应用数据被组织成tcp数据报之后,会缓存在tcp socket的发送缓存队列中,等待网络空闲转载 2012-09-29 17:36:45 · 10032 阅读 · 0 评论 -
make命令详解 一
Makefile文件 Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile 文件是许多编译器--包括 Windows NT 下的编译器--维护编译信息的常用方法,只是在集成开发环境中,用转载 2012-08-04 10:41:20 · 837 阅读 · 0 评论 -
linux signal 详解
信号本质信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以转载 2012-08-03 18:35:24 · 863 阅读 · 0 评论 -
Linux 指定动态库搜索路径
众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库,并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函 数,以及该动态库的其它资源了。在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下转载 2012-07-19 10:24:55 · 1084 阅读 · 0 评论 -
多线程中使用信号机制 pthread_sigmask()
在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别,可以说是完全不同。在进程环境中,对信号的处理是,先注册信号处理函数,当信号异步发生时,调用处理函数来处理信号。它完全是异步的(我们完全不知到信号会在进程的那个执行点到来!)。然而信号处理函数的实现,有着许多的限制;比如有一些函数不能在信号处理函数中调用;再比如一些函数read、recv等调用时会被异步的信号给中断(inter转载 2012-05-22 19:31:52 · 21270 阅读 · 0 评论 -
pthread_spin_lock 自旋锁
锁机制(lock) 是多线程编程中最常用的同步机制,用来对多线程间共享的临界区(Critical Section) 进行保护。Pthreads提供了多种锁机制,常见的有:1) Mutex(互斥量):pthread_mutex_***2) Spin lock(自旋锁):pthread_spin_***3) Condition Variable(条件变量):pthread_con_**转载 2012-05-22 19:54:28 · 16823 阅读 · 0 评论 -
CPU亲和性(affinity)sched_setaffinity() 和 sched_getaffinity()
简单地说,CPU 亲和性(affinity) 就是进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性。Linux 内核进程调度器天生就具有被称为 软 CPU 亲和性(affinity) 的特性,这意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。2.6 版本的 Linux 内核还包含了一种机制,它让开发人员可以编转载 2012-05-22 19:24:56 · 21255 阅读 · 0 评论 -
管道-pipe函数 进程间通信
摘要:在本系列序中作者概述了 linux 进程间通信的几种主要手段。其中管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 认清管道和有名管道的读写规则是在程序中应用它们的关键,本文在详细讨论了管道和有名管道的通信机制的基础上,用实例对其读写规则进行了程序验证,这样做有利于转载 2012-05-22 15:06:19 · 1365 阅读 · 0 评论 -
getopt 分析命令行参数
头文件 #include 函数原型 int getopt(int argc,char * const argv[ ],const char * optstring); extern char *optarg; extern int optind, opterr, optopt; 函数说明 getopt()用来分析命令行参数。转载 2012-05-22 15:01:12 · 723 阅读 · 0 评论 -
sysconf 获取计算机参数
头文件 #include函数原型 long sysconf(int name);说明 sysconf() 返回选项 (变量) 的当前值,这个值可配置的但也是受系统限制的。在成功完成的情况下,sysconf() 返回变量的当前值。该值受到的限制将少于编译时 , 或 中可用的对应值。大多数这些变量的值在调用进程的生存时间内不变。转载 2012-05-22 14:30:50 · 1852 阅读 · 0 评论 -
fcntl设置FD_CLOEXEC && fcntl(文件描述符操作)
这是fcntl的一个Flag标志。fcntl(fd, F_SETFD, FD_CLOEXEC); // 这里设置为FD_CLOEXEC表示当程序执行exec函数时本fd将被系统自动关闭,表示不传递给exec创建的新进程, 如果设置为fcntl(fd,F_SETFD, 0);那么本fd将保持打开状态复制到exec创建的新进程中FD_CLOEXEC用来设置文件的close-on-exec状转载 2012-05-20 11:14:42 · 1652 阅读 · 0 评论 -
Linux多线程编程-条件变量
1.初始化条件变量pthread_cond_init#include int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);返回值:函数成功返回0;任何其他返回值都表示错误初始化一个条件变量。当参数cattr为空指针时,函数创建的是一个缺省的条件变量。否则条件变量的属性将由cattr中转载 2012-06-06 22:51:12 · 724 阅读 · 0 评论 -
应用Valgrind 发现Linux 程序的内存问题
Valgrind 概述体系结构Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind的体系结构如下图所转载 2012-04-28 19:31:32 · 740 阅读 · 0 评论 -
在指定的线程接收信号 pthread_sigmask
概念按照 POSIX, 异步 (外部) 信号发送到整个进程. 所有线程共享同一个设置, 即通过 sigaction 设置的线程处置方法. 每个线程有自己的信号掩码, 线程库根据该掩码决定将信号发送到哪个线程. 由于 Linux 线程实现上的独特性, 外部信号始终发送到特定的线程. pthread_sigmaskpthread_sigmask 用来定义线程的信号掩码 其接口与转载 2012-05-22 19:47:40 · 4894 阅读 · 0 评论 -
pthread_setcancelstate() pthread_setcanceltype() pthread_testcancel()
NAMEpthread_setcancelstate, pthread_setcanceltype, pthread_testcancel - set cancelability state这三个函数用来设置线程是否可以被其他线程调用pthread_cancel函数取消/终止。SYNOPSIS 概要#include pthread.h>int pthread_s翻译 2012-05-23 14:20:05 · 8182 阅读 · 1 评论 -
实现目录拷贝 复制目录 复制文件
#include #include #include #include #include #include #include #ifndef DEBUG #define PDEBUG(fmt, args...)/ do{}while(0) #else #define PDEBU转载 2012-05-23 14:24:21 · 1295 阅读 · 0 评论 -
动态库加载出错,cannot restore segment prot after reloc: Permission denied以及为何编译动态库需要-fPIC
项目中碰到的问题,编译好的so文件,放到其他机器上去加载,报了错误,cannot restore segment prot after reloc: Permission denied。网上查了一下,原因是selinux的问题,selinux的设置太过严格导致的。解决的办法是在root用户下,修改/etc/selinux/config 文件,[cpp] view plain转载 2012-07-16 10:53:43 · 1578 阅读 · 0 评论 -
剖析 epoll ET/LT 触发方式的性能差异误解(定性分析)
平时大家使用 epoll 时都知道其事件触发模式有默认的 level-trigger 模式和通过 EPOLLET 启用的 edge-trigger 模式两种。从 epoll 发展历史来看,它刚诞生时只有 edge-trigger 模式,后来因容易产生 race-cond 且不易被开发者理解,又增加了 level-trigger 模式并作为默认处理方式。二者的差异在于 level-trigger转载 2012-06-20 16:46:22 · 2158 阅读 · 1 评论 -
Linux下timer的使用介绍,例子
1、alarm------------------------------------------- 如果不要求很精确的话,用alarm()和signal()就够了 unsigned int alarm(unsigned int seconds) 函数说明: alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数se转载 2012-06-20 18:53:46 · 1391 阅读 · 0 评论