国嵌系统编程学习笔记

一 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

进程互斥:若干个进程同时需要使用某一个共享资源。但是这个资源只可一次被一个进程使用。其它进程必须等待。直到占用该资源者放弃了使用。

临界资源:将一个只允许一个进程访问的资源称为临界资源。

临界区:进程中访问临界资源的那段程序代码称为临界区。为实现对临界区的互斥访问,应保证该进程互斥的进入个自临界区。

进程同步: 一组并发进程按照一定顺序执行的过程称为进程间的同步。

具有同步关系的一组并发进程称为合作进程。合作进程相互间互相发送的信号称为消息或者事件。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值