一 GCC
1 gcc是通过文件后缀来区别文件类别
.a 目标文件
.C .cc .cxx C++源文件
.i已经预处理过的C文件
.s 汇编文件
2 格式: gcc yuan.c -o yuan 生成一个名为yuan的可执行文件
-c 只编译 不链接成可执行文件 由 .c 到 .o
-g gdb 相关
-O 对程序优化编译链接 ,提高效率。
-Idirname 将dirname指出的目录加入到程序头文件的目录列表中
如 #include <stdio,h>
#include "A.h"
对于 < >预处理在默认的(如/usr/include)中寻找库文件
对于 “ ”在当前目录中寻找库文件。若没找到,在-Idirname中寻找库文件
-lname 在链接时候,装载libname.a的函数库。该函数库位于系统目录下活由 L选项确定的目录下。如-lm表示链接名为libm.a的数学函数库。
如 gcc foo.c -L/home/lim -lm -o foo
-static 静态链接库文件。
gcc -static hello.c -o hello
静态链接 ,是把库文件整个复制到可执行文件中。这样,可执行文件就是源文件形成的可执行文件大小加上加载的库的大小
动态链接,是可执行文件 在执行时需要库,就把那个库加载到相应位置。也就是说,可执行文件的大小不包括库文件。
-W生成所有警告信息
-w忽略所有警告信息
-DMACRO 相当于在源文件中用#define 定义了 一个MACRO宏
二、GDB:调试程序工具
过程:启动 设置断点 运行并查看程序或者相应变量的状态
启动:gcc -g ming.c -o ming
gdb ming
...
step 和 next都是单步执行。但是 遇到子函数时候,step是i进入到子函数中的,而next将之当做一步。
watch 变量名 监视变量名
print 变量名 显示出变量名的值
三 makefile 软件工程管理工具
描述工程的编译链接的规则
格式是
目标:依赖
规则
如:
hello : main.o func1.o func2.o
gcc main.c func1.c func2.c -o hello
若要再加一个func3.c
则变为
hello : main.o func1.o func2.o func3.o
gcc main.c func1.c func2.c func3.c -o hello
或者:obj=main.o func1.o func2.o func3.o
hello: $(obj)
gcc $(obj) -o hello
系统默认的自动化变量:
$^ 所有依赖文件
$ @ 目标
$< 第一个依赖文件
上例可改为:
hello : $(obj)
gcc $^ -o $@
把那些没有任何依赖只有可执行动作的目标称为伪目标(phony target)
.phony clean
clean:
rm -f hello main.o func1.o func2.o
文件编程:
创建:int creat(const char *pathname,mode_t mode)
mode可以用数字表示 分别为 读写执行 111
S_IRUSR 读
S_IWUSR 写
S_IXUSR执行
(还有别的宏模式。而且这三个都是针对文件所有者的
int open(const char *pathname,int flags,mode_t mode);
若flag中有O_CREAT属性,那么必须有有mode属性
int close(fd)关文件
读: int read(int fd,const void *buf,size_t length)
从fd指定的文件中读取length个字节到buf中,返回实际读到的字节数。
写: int write(同读)写到fd中。返回实际写入字节数
定位: int lseek(int fd,offset_t offset, int whence)
将文件读写指针相对于whence的位置移动offset个字节
whence的宏: SEEK_SET 开头
SEEK_CUR 当前位置
SEEK_END文件胃部
由于返回的是相对于文件头部的位置因此
lseek(fd,0,SEEK_END)返回的是fd指向的文件的大小
查看权限: int access(const char*pathname ,int mode)
mode 判断访问权限:R_OK 可读 W_OK可写 X_OK可执行 成功返回0 失败返回-1
经典的拷贝文件代码:
while (nread=read(from fd,buffer,SIZE))
{
if(nread==-1&&(errno!=EINTR) ) break
else if(n_read>0)
{
ptr=buffer;
while(n_write=write(to_fd,ptr,n_read))
{
if(n==-1&&(errno!=EINTR)) break;
else if(n_write==b_read) break;
else if(n_write>0)
{
ptr=n_write;
n_read-=n_write;
}
}
if(n_write==1)break;
}
}
库函数访问:
fopen fclose fread fwrite fseek ftell fscanf fprintf
略过
进程控制理论基础:
定义:进程是一个具有一定独立功能的程序的一次运行活动
状态:就绪 阻塞 执行 三种状态
进程ID
进程互斥:若干个进程同时需要使用某一个共享资源。但是这个资源只可一次被一个进程使用。其它进程必须等待。直到占用该资源者放弃了使用。
临界资源:将一个只允许一个进程访问的资源称为临界资源。
临界区:进程中访问临界资源的那段程序代码称为临界区。为实现对临界区的互斥访问,应保证该进程互斥的进入个自临界区。
进程同步: 一组并发进程按照一定顺序执行的过程称为进程间的同步。
具有同步关系的一组并发进程称为合作进程。合作进程相互间互相发送的信号称为消息或者事件。