1.GCC使用
gcc -E hello.c -o hello.i
gcc -c hello.i -o hello.o
gcc -
2.GDB使用
常用命令:
1. list(l) 显示附近代码
2. next(n) 执行下一条命令
3. print(p) 打印变量或语句
4. backtrace(bt) 显示函数栈
5. finish 退出函数
6. break 添加断点
7. info break 查看断点信息
8. enable break-num 使断点可用
9. enable 使所有断点可用
10. delete 删除所有断点
10. delete break-num 删除一个断点
11. enable delete num 使该断点在命中一次后删除
12. enable count hit-times break-num 使该断点在命中hit-times次后删除
13. local 打印当前函数的局部变量
3.MakeFile
概念:将编译和链接要执行的命令按照一定的顺序写进一个文件里
执行make的时候会以最终生成的目标文件为根节点遍历执行所有的编译命令
4.文件IO
1.基本API
1. `int open(const str * filepath, int oflag, [...,mode_t mode])` (sys/types.h sys/stat.h fcntl.h)
filepath--文件路径
oflag--打开方式
O_WRONLY 只写方式
O_RDWR 读写方式
O_APPEND 追加方式
O_CREAT 不存在就创建,需要添加第三个参数,指明访问权限
O_EXCL 如果同时指定O_CREATE ,则文件存在时报错,可用于测试文件是否存在
mode--访问权限
2.`ssize_t read(int fd, void *buf, size_t count)`(unistd.h)
fd--需要读取的文件的文件描述符
buf--得到的数据存储的位置
count--读取的大小
返回读取的数据的大小,出错返回-1
3.`write(int fd, const void * buf, size_t count)`(unistd.h)
fd--需要写入的稳健
buf--需要写入的数据
count--写入的数据的大小
返回写入的数据的大小,出错返回-1
4.`close(int fd)`(unistd.h)
5.`lseek(int fd, int offset, int whence)`(sys/types.h unistd.h)
fd--操作的文件
offset--偏移量
whence--相对哪个位置的偏移量
SEEK_SET
SEEK_CUR
SEEK_END
6.`int select(int maxfd, fdset *read_set, fdset *write_set, fdset *excep_set, struct timeval *timeout)`(sys/select.h) 失败返回-1,成功返回所有有变化的描述符的个数,超时返回0
maxfd--检测个数
read_set--输入描述符个数
write_set--输出描述符个数
excep_set--异常描述符个数
timeout--超时时间,NULL表示无限长直到检测到消息
**配套函数(调用之前所有监控的描述符都要置1,返回时就绪的会被置1,否则清0)**
FD_SET(fd, fdset *) 置1
FD_ISSET(fd, fd_set *) 是否置1
FD_ZERO(fdset *) 清0
FD_CLR(fd, fdset *) 置0
7.`int stat(const char * filepath, struct stat * buf);`(sys/types.h sys/stat.h unistd.h)成功返回0,失败返回-1
struct stat {
dev_t st_dev;
ino_t st_ino;//节点号
mode_t st_mode;//文件类型
nlink_t st_nlink;//硬链接数([Linux的硬链接和软链接](http://www.cnblogs.com/itech/archive/2009/04/10/1433052.html))
uid_t st_uid;//属主用户
gid_t st_gid;//所属组
dev_t st_rdev;
off_t st_size;//大小
blksize_t st_blksize;
blkcnt_t st_blocks;
time_t st_atime;//最后访问时间
time_t st_mtime;//最后修改的时间
time_t st_ctime;//创建时间
}
8. `struct dirent* readdir(DIR * dir)`成功返回dirent结构体,失败返回NULL
struct dirent {
ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
unsigned char d_type;
char d_name[256];
};
9. `int closedir(DIR * dir)`成功返回0, 失败返回 -1
5. 多进程编程
1、Linux进程状态
R
S
D
T
Z
X
2、Linux下C进程内存布局
text
initialized data
malloc
stack
3、`int exec(const char * pathname, const char * arg0...)`
exec:传入一个参数,用新的程序来替代原来子进程中的正文、数据、堆和栈,失败返回-1,成功永不返回
4、fork:调用一次返回两次,子进程返回0,父进程返回子进程的进程id,失败返回-1,子进程会复制父进程的正文、数据、堆、栈。
5、多进程的调试:
1. 在子进程开始的地方加上sleep(20)
2. 查看子进程的pid,使用gdb pid再开一个调试程序
3. 用break添加断点
4. 用continue继续
5. 等待睡眠结束
6、Exit Handler
处理进程退出后的事宜,注册方式有两种
atexit(void (*func) (void))
on_exit(void (*func)(int, void*))