随笔分类 - c
摘要:文件系统ext2文件系统分区的格式化工具mkfs文件系统的总体存储布局boot block(1kb)block group 0 super block (超级块):描述整个分区的文件系统信息 GDT(块组描述表group descriptor table):由块组描述符组成 block bitmap(块位图) 用来描述整个块组中哪些块已用哪些块空闲 inode bitmap(inode 位图):本身占一个块,每个bit表示一个inode可用 inode table(inode 表):文件的描述信息存放在inode中,每个文件都有一个 node,一个块组的...
阅读全文
摘要:mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址对文件的读写可以直接用指针来作,不需要read/write函数#include /*如果addr参数为NULL,内核会在进程地址空间中选择合适的地址建立映射 如果不为空,则指定从什么地址开始映射 len 指定文件的映射长度 off 是指从文件的什么位置开始映射,是页大小的整倍数(32位体系结构通常是4k) filedes 是文件的描述符 prot 有四种取值: PROT_EXEC 表示映射的这一段可执行,如映射共享库 PROT_READ 表示映射的这一段可读 PROT_WRITE 表示映射的这一段可...
阅读全文
摘要:lseek文件在打开时读写位置是0,如果是以O_APPEND方式打开,位置会移致动到文件末尾#include #include /*移动当前读写位置 参数同fseek offset 偏移量 whence 起始位置*/off_t lseek(int fd,off_t offset,int whence);打开文件的当前偏移量off_t currpos;currpos=lseek(fd,0,SEEK_CUR);fcntl改变一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞标志(file statusflag)#include #include int fcntl(int fd,int cm
阅读全文
摘要:2 标准I/O库函数文件的基本概念 文本文件(源文件) 二进制文件(目标文件,可执行文件,库文件) 查看二进制文件: hexdump 示例代码如下: 编辑文件:viyuezhenhua@ubuntu:/opt/sdk/tc$ vi textfile 1234 查看文件长度:ls -l 文件名 yuezhenhua@ubuntu:/opt/sdk/tc$ ls -l textfile-rw-rw-r-- 1 yuezhenhua yuezhenhua 5 2012-12-02 17:48 textfile 查看文件的内容:od -txl -tc -Ax 文件名 yuezhenhua...
阅读全文
摘要:c标准库1 字符串操作函数 初始化字符串#include /*s指向哪,返回的指针就指向哪*//*把s所指的内存地址开始的n个字节,都填充为c的值,c为0*/void *memset(void *s, int c,size_t n); 取字符串的长度#include /*返回s所指字符串的长度*/size_t strlen(const char *s); 示例代码如下char buf[]="hello";strlen(buf);/*错误方法*/char buf[5]="hello";strlen(buf);//会造成数组访问越界 考贝字符串strcpy
阅读全文
摘要:函数接口 示例代码如下:man page http://www.linuxmanpages.com/NAME#把一个字符串考贝到另一个字符串strcpy, strncpy - copy a string SYNOPSIS#函数原型#include #dest 目标字串#src 源字串char *strcpy(char *dest, const char *src);#会把末尾的\n一起考贝到目录字串中#目标字串空间要足够大,防止越界#n 指定字节数,如果src不足,则用\0补齐char *strncpy(char *dest, const char *src, size_t n);mall..
阅读全文
摘要:指针 占4个字节的存储空间概念把一个变量所在的内存单元保存在另一个内存单元中,保存单元的这个地址就是指针示例代码:int i;int *pi=&i;指针的重新赋值pi=&j;改变指针所指向的整型变量的值*pi =*pi+10;指针初始化另一个指针(两指针必须为同一类型)int *ptri;ptri =pi;可以进行强制类型转换char *pc;int *pi;pi=(int *)pc;void指针常用于接口示例代码如下:void func(void *pv){char *pchar=pv;*pchar='A';}int main(void){char c;fun
阅读全文
摘要:自动处理头文件的依赖关系all:test34test34:test34.o test33.o test31.o gcc$~ -o $@ test34.o:test34.c test29.h test30.h test32.h test33.o:test33.c test32.h test29.h test31.o:test31.c test30.h test29.hclean: -rm main *.o.PHONY:clean生成目标文件和源文件的依赖关系gcc -M test34.cyuezhenhua@ubuntu:/opt/sdk/tc/makefile$ gcc -M tes...
阅读全文
摘要:makefile中关于变量的语法规则示例代码如下:foo = $(bar)bar = Huh?all:@echo $(foo)执行make后输出: Huh?优点: 可以把变量的值推迟到后面定义示例代码:main.o:main.c$(CC) $(CFAGS) $(CPPFLAGS) -C $<CC=gcc#编译选项CFAGS= -O -g#预处理选项CPPFLAGS= -Iinclude编译展开后为:gcc -O -g -Iinclude -c main.c示例代码:x := foo#$(x)会立即展开y := $(x) bar#定义一个变量的值是空格nullstring :=space
阅读全文
摘要:makefile基础基本规则一般的程序都是由多个源文件编译链接而成,而这些源文件的处理通常是由makefile来处理示例代码如下:/*test29.h*/#ifndef MAIN_H#define MAIN_H/*声明点类型*/typedef struct point {int row,col} item_t;/*声明最大列和行变量*/#define MAX_ROW 5#define MAX_COL 5#endif/*test30.h定义堆栈头文件*/#ifndef STACK_H#define STACK_H#include "test29.h"extern void p
阅读全文
摘要:条件预处理指示示例代码如下:(头文件定义中)#ifndef HEADER_FILENAME#define HEADER_FILENAME/*body of header */#endif也可以用于源代码的配置管理/*在68000平台x定义为int */#if MACHINE==68000 int x;/*在8086平台x定义为long */#end if MACHINE==8086long x;#else /*all others */ #error UNKNOWN TARGET MACHINE#endif取消一些宏的定义#undef其它预处理特性#pragma供编译器实现阶一些非标准的特性.
阅读全文
摘要:预处理预处理的步骤:1 把三连符替换成相应的单字符 替换规则: ??= # ??/ \ ??’ ^ ??( [ ??) ] ??! | ??< { ??> } ??- ~2 把\字符续行的多行代码接成一行3 把注释替换成一个空格4 预处理器把剩下的逻辑代码划分成预处理token和空白字符,5 在token中识别出预处理指示,作相应动作 #inclucd 引入相应的源文件 宏定义作宏展开6 替换字符常量和字符串中的转义字符7 把代码中相邻的字符串连接起来8 去掉空白字符(空格/换行/水平tab/垂直tab) 宏定义变量宏定义:...
阅读全文
摘要:虚拟内存管理查看进程: ps显示结果: PID TTY TIME CMD 1979 pts/0 00:00:00 bash 2048 pts/0 00:00:00 ps查看bash的虚拟地址空间: cat /proc/1979/maps 或是pmap 1979 显示结果:08048000-08123000 r-xp 00000000 08:01 786438 /bin/bash08123000-08124000 r--p 000da000 08:01 786438 /bin/bash08124000-08129000 rw-p ...
阅读全文
摘要:共享库命名规范:通常带有符号链接 ls -l /lib... libipq_pic.so.0 libulockmgr.so.1libipq_pic.so.0.0.0 libulockmgr.so.1.0.1libipq.so.0 libusb-0.1.so.4libipq.so.0.0.0 libusb-0.1.so.4.4.4...共享库文件名的组成: real name 库文件 soname 符号链接的名字,共享库的主版本号 示例代码: /*soname:libstack.so.1 ...
阅读全文
摘要:静态库在一定场景下将一些代码编译成一个库文件,以供其他程序使用示例代码如下: 20-23文件放在子目录stack中 test20.c文件: char stack[512]; int top=-1; test21.c文件: extern char stack[512]; extern int top; void push(char c){ stack[++top]=c; } test22.c文件: extern char stack[512]; extern int top; char pop(void){return stack[top--]; } test23.c文件: extern ...
阅读全文
摘要:多目标文件的链接示例代码如下:test18.cchar stack[512];int top=-1;void push(char c){stack[++top]=c;}char pop(){return stack[top--];}int is_empty(void){return top==-1;}test19.c#include <stdio.h>int a,b=1;int main(void){ push('a');push('b');push('c'); while(!is_empty()){putchar(pop());}p
阅读全文
摘要:结构体 示例代码#include<stdio.h>int main(void){struct{ charo a; short b; int c; char d; }s;s.a=1;s.b=2; s.c=3; s.d=4;printf("%u\n",sizeof(s));return 0;} 编译:gcc test.c -o 反汇编:objdump test四个成员变量在栈上的排列80483ed: c6 44 24 14 01 movb $0x1,0x14(%esp)80483f2: 66 c7 44 24 16 02 00 movw $0...
阅读全文
摘要:ELF 文件三种格式:1 可重定位的目标文件 可用readelf工具读取 readelf -a 文件名ELF headerprogram header tablesection header table目标文件的布局 起始文件地址 Section或Header 0 ELF Header 0x34 .text 0x60 .data 0x98 .bss (此段为空) 0x98 .shstrtab 0xc8 Section Header Table 0x208 .symtab 0x288 .strta...
阅读全文
摘要:文件I/O.data msg : .string "Hello, world!\n" len = . - msg.text.global _start_start: movl $len, %edx movl $msg, %ecx movl $1 , %ebx movl $4 , %eax int $0x80 movl $0 , %ebx movl $1 , %eax int $0x80c 代码: #include<stdio.h> #define LEN 14 char msg[LEN]="hello, world!\n"; int ...
阅读全文
摘要:内存与地址32位x86 ,从0x0000 0000到0xffff ffffcpu的功能单元:寄存器:register,高速存储器,像内存一样存取数据 eax 通用寄存器 ebx ecx edx edi ebp eip 程序计数 程序计数器:program counter,指令解码器:instruction decoder算术逻辑单元:arithmetic and logic unit地址和数据总线:bus 示例:访问内存读取数据 cpu 将寄存器对接到数据总线上,使寄存器每一位对接到一条数据线,等待接收 cpu 将内存地址通过地址线发给内存,控制...
阅读全文
浙公网安备 33010602011771号