随笔分类 - Linux C
使用ptrace向已运行进程中注入.so并执行相关函数(转)
摘要:1. 简介 使用ptrace向已运行进程中注入.so并执行相关函数,其中的“注入”二字的真正含义为:此.so被link到已运行进程(以下简称为:目标进程)空间中,从而.so中的函数在目标进程空间中有对应的地址,然后通过此地址便可在目标进程中进行调用。 到底是如何注入的呢? 本文实现方案为:在目...
阅读全文
ARM 汇编与C调用的若干问题(一般函数调用情况)
摘要:ARM 汇编与C之间的函数调用需要符合ATPCS,建议函数的形参不超过4个,如果形参个数少于或等于4,则形参由R0,R1,R2,R3四个寄存器进行传递;若形参个数大于4,大于4的部分必须通过堆栈进行传递。 R0 用来存放函数的第一个参数,R1用来存放第二个参数,R2用来存放第三个参数,R3用来存放第...
阅读全文
玩转ptrace(转)
摘要:下面是转帖的内容,写的很详细。但是不同的linux发行版中头文件的路径和名称并不相同。如在某些发行版中就不存在,其中定义的变量出现在和中。=================================================================================...
阅读全文
LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror(转)
摘要:dlopen基本定义 功能:打开一个动态链接库 包含头文件: #include 函数定义: void * dlopen( const char * pathname, int mode ); 函数描述: 在dlopen的()函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用...
阅读全文
Swap简介(转)
摘要:Swap基本原理众所周知,现代操作系统都实现了“虚拟内存”这一技术,不但在功能上突破了物理内存的限制,使程序可以操纵大于实际物理内存的空间,更重要的是,“虚拟内存”是隔离每个进程的安全保护网,使每个进程都不受其它程序的干扰。Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。计算机用户会经常遇这种现象。例如,在使
阅读全文
调试core文件(转)
摘要:调试core文件当获得了core文件以后,就可以利用命令gdb进行查找,参数一是应用程序的名称,参数二是core文件。也可以用-c来指定core文件。如:gdb [paremeter] app [paremeter] /app.core然后输入bt(backtrace)或者where找到错误发生的位置和相应的堆栈信息。就可知道发生错误时的函数调用关系,然后可以使用up或者down查看上一条和下一条具体详细信息。这样便能对问题进行大概定位,然后看源代码,进行分析。此外,还可以用f堆栈号 打印该对堆栈进一步的信息;l(ist)查看源码,n(ext),s(step)进行查看。原文:http://ww
阅读全文
char 与 unsigned char的本质区别(转)
摘要:在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字。在实际使用过程种有什么区别呢?主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高
阅读全文
char和unsigned char强制转换成int后的差异(转)
摘要:最近有人提到char和unsigned char有什么区别,当然这个问题如果刚学计算机或者编程语言的人来说,非常简单。我也这么认为,无非就是有符号和无符号的差别嘛。这个问题让我想到了以前学习计算机常识的时候关于补码,原码,反码的差异。这里摘取参考文章【1】中的部分内容:注意:此处的'=='是相等的意思。'='是赋值的意思。在机器世界里:正数的最高位是符号位0,负数的最高位是符号位1。对于正数:反码==补码==原码。对于负数:反码==除符号位以外的各位取反。 补码==反码+1. 原码==补码-1后的反码==补码的反码+1。(读完本文后,应该能够直观地认识到本式的正
阅读全文
长连接和短连接(转)
摘要:长连接和短连接TCP/IP编程具有较为丰富的内容。其编程的丰富性主要体现在通信方式和报文格式的多样性上。通信方式 主要有以下三大类:(一)SERVER/CLIENT方式1.一个Client方连接一个Server方,或称点对点(peer to peer):2.多个Client方连接一个Server方,这也是通常的并发服务器方式。(二)连接方式1.长连接Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在,可以用下面命令查看连接是否建立:netstat-f inet|grep端口号(如5678)。 此种方式常用于点对点通讯。2.短
阅读全文
epoll其他花絮(转)
摘要:epoll是做为一个虚拟文件系统来实现的,这样做至少有以下两个好处:1、可以在内核里维护一些信息,这些信息在多次epoll_wait间是保持的,比如所有受监控的文件描述符。2、epoll本身也可以被poll/epoll; 【1】epoll的实现中,所等待的设备就绪后,便调用call_back函数,把该设备加入到就绪队列中,避免了像poll那样设备就绪后再次轮询所有设备找就绪者,由O(n)降到O(1)。 传统的poll函数相当于每次调用都重起炉灶,从用户空间完整读入ufds,完成后再次完全拷贝到用户空间,另外每次poll都需要对所有设备做至少做一次加入和删除等待队列操作,这些都是低效的原因。3、
阅读全文
epoll使用(转)
摘要:1、epoll使用模型示例程序1View Codefor(;;){ nfds = epoll_wait(epfd, events, 20, 500); for(i =0; i < nfds; ++i) { if(events[i].data.fd == listenfd) //监测到有新的连接 { connfd = accept(listenfd, (sockaddr *)&clientaddr, &clilen); //accept这个连接 ev.data.fd = connfd; ...
阅读全文
epoll基本概念(转)
摘要:1、基于概念 epoll是一种机制,来处理大量并发连接时事件的读写顺序。在linux的网络编程中,很长的时间都在使用select来做事件触发。2.5.X内核后,引入epoll。epoll是Linux内核为处理大批量句柄而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。因为它不会复用文件描述符集合来传递结果而迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的
阅读全文
linux中read,write和recv,send的区别(转)
摘要:1、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或是以下的组合:_______________________________________________________________| MSG_DONTROUTE |不查找路由表|| MSG_OOB |接受或发送带外数据|| MS
阅读全文
setsockopt中参数之SO_REUSEADDR的意义(转)
摘要:1、一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态2、SO_REUSEADDR和SO_REUSEPORTSO_REUSEADDR提供如下四个功能:SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重
阅读全文
Linux中网络编程的常用函数(2)
摘要:10、Linux环境下的##连接符与args...混合使用 前面【1】中叙述了#,##的使用方法,【2】中叙述了va_list的使用方法。【1】http://www.cnblogs.com/mydomain/archive/2010/09/25/1834917.html【2】http://www.cnblogs.com/mydomain/archive/2010/12/06/1898187.html在Linux下,还有一种使用形式,如下:#define NO_DATA(fmt, args...) \{\fprintf(stdout, fmt, ##args);\}int main(int ar
阅读全文
Linux中网络编程的常用函数(1)
摘要:1、fcntl头文件#include <fcntl.h>#include <fcntl.h>定义函数int fcntl(int fd , int cmd);int fcntl(int fd,int cmd,long arg);int fcntl(int fd,int cmd,struct flock * lock);fcntl()用来操作文件描述符的一些特性。参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令。其详细情况见参考中。【1】http://linux.die.net/man/2/fcntl【2】http://baike.baidu.com/view/1
阅读全文
pthread读写锁
摘要:读写锁 (rwlock)功能特点简介读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。在读写锁保持期间也是抢占失效的。如果读写锁当前没有读者,也没有写者,那么写者可以立刻获得读写锁,否则它必须自旋在那里,直到没有任何写者或读者。如果读写锁没有写者,那么读者可以立即获得该读写锁,否则读
阅读全文
9、多线程小结(2)(转)
摘要:9、多线程小结(2)3)合并线程:pthread_join int pthread_join(pthread_t* thread, void **ret); 第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。关于什么是可joinable的线程,参见[3]。4)通过到斥实现线程同步(1)声明互斥锁变量:pthread_mutext_tmutex;pthread_mutex_t为不公开的数据类型,其中包含一个系统分配的属性对象。(2)互斥
阅读全文
8、多线程小结(1)(转)
摘要:8、多线程小结(1)1、在Linux中,线程一般被认为是“轻量级的进程”。Linux创建进程所使用的函数是fork()或者vfork()。而对线程的创建和管理Linux可以使用POSIX的线程库pthreads提供的APIs。2、使用fork()创建进程和使用POSIX线程库差别:使用fork()创建进程的特点:①代价昂贵,通常子进程需要拷贝父进程的整个上下文,比如数据等。②进程间的通信方式比较复杂,比如使用管道、消息、共享内存等方法。③操作系统在实现进程间的切换比线程切换更费时。使用POSIX pthreads库创建线程的特点:①线程可使用存在于进程中的资源,因此创建进程比创建线程更快。②线
阅读全文
7、取消点的进一步讨论(转)
摘要:7、取消点的进一步讨论线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态决定。线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点,也就是说设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。(1)什么是线程取消点根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_con
阅读全文
浙公网安备 33010602011771号