一、vim安装学习使用:
1.普通模式和插入模式
2.移动光标h左j下k右l上
3.删除字符x、dd、u、ctrl+r
删除一个字符x
删除一行dd
恢复删除u
取消一个命令ctrl+r
4.复制粘贴p、y
vim下的粘贴命令字符是p,它的作用是将内存中的字符复制到光标后面
具体方法是:用dd命令删除它,然后使用u命令恢复,这时候内存中是dd命令删除的字符串。
复制命令是y,将指定的字符串复制到内存中,yw命令复制一个单词
复制一行yy
5.查找字符串
/xxx
6.跳转到某一行
:n
二、Linux下GCC编译器工具集
1.编译单个文件成执行文件
gcc hello.c
具体过程:GCC编译器可以识别默认文件扩展名,通过检查文件扩展名,GCC知道这是一个C文件。
采取默认步骤,先将C文件编译成目标文件,然后将目标文件链接成可执行文件,最后删除目标文件,没有指定生成执行文件的名称,生成a.out
选项-o可以使编译程序生成指定文件名
gcc -o test hello.c
./test
选项-c用于生成目标文件,这一选项将源文件生成目标文件,而不是生成可执行文件。
gcc -c hello.c(生成hello.o)
2.多文件编译
GCC可以自动编译连接多个文件,不管是目标文件还是源文件,都可以使用同一个命令编译到一个可执行文件中。
例:main.c和string.c
gcc -o test string.c main.c
./test
也可以先将源文件编成目标文件,然后在进行链接。
gcc -c string.c main.c
gcc -o test string.o main.o
3.编译成汇编语言
生成汇编语言的选项是-S,扩展名是.s
gcc -S string.c
4.Makefile的编写
一个Makefile文件主要包含以下几个内容:
1.由make工具创建的目标体(target),通常是目标文件或可执行文件。
2.要创建的目标体所依赖的文件(dependency_file)
3.创建每个目标体时需要运行的命令(command)
http://www.360doc.com/content/09/0109/18/36491_2298945.shtml
最基本的写法:
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
clean:
rm -f *.o main
改进1:使用变量
1.make变量(Makefile中定义的或者是make的环境变量)的引用使用“$(VAR)”格式,无论“VAR”是单字符变量名还是多字符变量名。
2. 出现在规则命令行中shell变量(一般为执行命令过程中的临时变量,它不属于Makefile变量,而是一个shell变量)引用使用shell的“$tmp”格式。
3. 对出现在命令行中的make变量同样使用“$(CMDVAR)” 格式来引用。
OBJ=main.o mytool1.o mytool2.o
make:$(OBJ)
gcc -o main $(OBJ)
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
clean:
rm -f main $(OBJ)
改进2:使用自动推导
让make自动推导,只要make看到一个.o文件,它就会自动的把对应的.c文件加到依赖文件中,并且gcc -c .c也会被推导出来,所以Makefile就简化了。
CC = gcc
OBJ = main.o mytool1.o mytool2.o
make: $(OBJ)
$(CC) -o main $(OBJ)
main.o: mytool1.h mytool2.h
mytool1.o: mytool1.h
mytool2.o: mytool2.h
.PHONY: clean
clean:
rm -f main $(OBJ)
改进三:自动变量($^ $< $@)的应用
Makefile 有三个非常有用的变量,分别是$@、$^、$<。代表的意义分别是:
$@--目标文件,
$^--所有的依赖文件,
$<--第一个依赖文件。
CC = gcc
OBJ = main.o mytool1.o mytool2.o
main: $(OBJ)
$(CC) -o $@ $^
main.o: main.c mytool1.h mytool2.h
$(CC) -c $<
mytool1.o: mytool1.c mytool1.h
$(CC) -c $<
mytool2.o: mytool2.c mytool2.h
$(CC) -c $<
.PHONY: clean
clean:
rm -f main $(OBJ)
三.文件的通用操作方法
1.open与creat
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
int creat(const char *pathname,mode_t mode);
打开或建立一个文件。对于open函数,仅当创建文件时,才用到第三个参数
打开成功,返回一个文件描述符的值,出错时返回-1
文件的打开标志flags用于设置文件打开后允许的操作方式:
只读O_RDONLY
只写O_WRONLY
读写O_RDWR
可选参数
O_APPEND 每次对文件进行写操作都追加到文件的尾端
O_CREAT 如果文件不存在则创建它,当使用此选项时,第三个参数mode需要同时设定,用来说明新文件的权限
O_EXCL 查看文件是否存在,如果同时制定了O_CREAT,而文件已经存在,则会报错
O_TRUNC 如果此文件存在,而且为只读或读写成功打开,则将其长度截短为0。
O_NOCTTY 如果pathname指的是终端设备,则不将该设备分配作为此进程的控制终端。
O_NONBLOCK 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文件的本次打开操作和后续的I/O操作设置非阻塞模式
mode:用下列一个或多个常量进行“或”运算构成mode参数(这些常量定义在sys/stat.h)
S_IWUSR:00200 拥有者写权限
fd = open(filename,O_RDWR);
if(-1==fd)
printf("Open file %s failure!,fd:%d\n",filename,fd);//文件不存在
else{
printf("Open file %s sucess!,fd:%d\n",filename,fd);
}
建立一个空的test.txt
echo "">test.txt
注意:OCREAT与OEXCL结合使用可以编写容错的程序
/*O_CREAT与O_EXCL结合使用*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
int fd = -1;
char filename[]="test.txt";
//打开文件,如果文件不存在,则报错
fd = open(filename,O_RDWR|O_CREAT|O_EXCL,S_IRWXU);
if(-1==fd)//文件存在
{
printf("File %s exist!,reopen it",filename);
fd=open(filename,O_RDWR);
printf("fd:%d\n",fd);
}
else//文件不存在,创建并打开
{
printf("Open file %s success,fd:%d\n",filename,fd);
}
return 0;
}
2.close
#include <unistd.h>
int close(int fd);
close 关闭一个文件描述符,关闭以后此文件描述符不在指向任何文件,从而描述符可以再次使用,成功返回0,错误返回-1.
系统打开第一个文件的文件描述符的值为3
3.read
用read()函数从打开文件中读取数据,用户可以对读入的数据进行操作。
#include <unistd.h>
ssize_t read(int fd,void *buf,size_t count);
read()函数从文件描述符fd对应的文件中读取count字节,放到buf开始的缓冲区。
读取成功后,文件对应的读取位置指针,向后移动位置,大小为成功读取的字节数。返回读取的字节数。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
int fd=-1,i;
ssize_t size = -1;
char buf[10];
char filename[]="test.txt";
fd=open(filename,O_RDONLY);
if(-1==fd)
printf("Open file %s failure,fd:%d\n",filename,fd);
else{
printf("Open file %s success,fd:%d\n",filename,fd);
}
while(size)
{
size = read(fd,buf,10);//every time read 10 ge zi jie data
if(-1 == size){
close(fd);
printf("read file error occurs\n");
return -1;
}
else{
if(size > 0){
printf("read %d bytes:",size);
printf("\"");
for(i=0;i<size;i++)
printf("%c",*(buf+i));
printf("\"\n");
}
else{
printf("mowei size = %d",size);
printf("reach the end of file\n");
}
}
}
return 0;
}
4.write
向打开的文件中写入数据,将用户的数据保存到文件中
#include <unistd.h>
ssize_t write(int fd,const void *buf,size_t count);
当操作的对象是普通文件时,写文件的位置从文件的当前开始,操作成功后,写的位置会增加写入字节数的值。
如果在打开文件的时候指定了O_APPEND项,每次写操作之前,会将写操作的位置移到文件的结尾处。
cat主要有三大功能:
1.一次显示整个文件。$ cat filename
2.从键盘创建一个文件。$ cat > filename
只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件: $cat file1 file2 > file
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
int fd = -1,i;
ssize_t size = -1;
int input=0;
char buf[]="quick brown fox jumps over the lazy dog";
char filename[]="s.txt";
fd = open(filename ,O_RDWR);
if(-1==fd)
printf("Open file %s failure,fd:%d\n",filename,fd);
else
printf("Open file %s success,fd:%d\n",filename,fd);
size = write(fd,buf,strlen(buf));
printf("write %d bytes to file %s\n",size,filename);
close(fd);
return 0;
}
注意:要在写入前对文件进行清空,可以使用open()函数的O_TRUNC选项,将打开的函数修改为如下形式:
fd = open(filename , O_RDWR | O_TRUNC );
5.lseek()
可以设置文件偏移量的位置
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fildes,off_t offset,int whence);对文件操作符fildes所代表的文件,按照操作模式whence和偏移量的大小offset,重新设定文件的偏移量
操作成功返回新偏移量的值,失败返回-1。
文件偏移量可以为负值
参数whence和offset结合使用:
如果whence为SEEK_SET,则offset为相对文件开始处的值,即将该文件偏移量设为距文件开始处offset个字节
如果whence为SEEK_CUR, 则offset为相对当前位置的值,即将该文件的偏移量设为当前值加offset
如果whence为seek_end, 则offset为相对文件结尾的值,即将该文件的偏移量设置为文件长度加offset
获得当前的偏移量
off_t cur_pos = lseek(fd, 0, SEEK_CUR);
1.普通模式和插入模式
2.移动光标h左j下k右l上
3.删除字符x、dd、u、ctrl+r
删除一个字符x
删除一行dd
恢复删除u
取消一个命令ctrl+r
4.复制粘贴p、y
vim下的粘贴命令字符是p,它的作用是将内存中的字符复制到光标后面
具体方法是:用dd命令删除它,然后使用u命令恢复,这时候内存中是dd命令删除的字符串。
复制命令是y,将指定的字符串复制到内存中,yw命令复制一个单词
复制一行yy
5.查找字符串
/xxx
6.跳转到某一行
:n
二、Linux下GCC编译器工具集
1.编译单个文件成执行文件
gcc hello.c
具体过程:GCC编译器可以识别默认文件扩展名,通过检查文件扩展名,GCC知道这是一个C文件。
采取默认步骤,先将C文件编译成目标文件,然后将目标文件链接成可执行文件,最后删除目标文件,没有指定生成执行文件的名称,生成a.out
选项-o可以使编译程序生成指定文件名
gcc -o test hello.c
./test
选项-c用于生成目标文件,这一选项将源文件生成目标文件,而不是生成可执行文件。
gcc -c hello.c(生成hello.o)
2.多文件编译
GCC可以自动编译连接多个文件,不管是目标文件还是源文件,都可以使用同一个命令编译到一个可执行文件中。
例:main.c和string.c
gcc -o test string.c main.c
./test
也可以先将源文件编成目标文件,然后在进行链接。
gcc -c string.c main.c
gcc -o test string.o main.o
3.编译成汇编语言
生成汇编语言的选项是-S,扩展名是.s
gcc -S string.c
4.Makefile的编写
一个Makefile文件主要包含以下几个内容:
1.由make工具创建的目标体(target),通常是目标文件或可执行文件。
2.要创建的目标体所依赖的文件(dependency_file)
3.创建每个目标体时需要运行的命令(command)
http://www.360doc.com/content/09/0109/18/36491_2298945.shtml
最基本的写法:
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
clean:
rm -f *.o main
改进1:使用变量
1.make变量(Makefile中定义的或者是make的环境变量)的引用使用“$(VAR)”格式,无论“VAR”是单字符变量名还是多字符变量名。
2. 出现在规则命令行中shell变量(一般为执行命令过程中的临时变量,它不属于Makefile变量,而是一个shell变量)引用使用shell的“$tmp”格式。
3. 对出现在命令行中的make变量同样使用“$(CMDVAR)” 格式来引用。
OBJ=main.o mytool1.o mytool2.o
make:$(OBJ)
gcc -o main $(OBJ)
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
clean:
rm -f main $(OBJ)
改进2:使用自动推导
让make自动推导,只要make看到一个.o文件,它就会自动的把对应的.c文件加到依赖文件中,并且gcc -c .c也会被推导出来,所以Makefile就简化了。
CC = gcc
OBJ = main.o mytool1.o mytool2.o
make: $(OBJ)
$(CC) -o main $(OBJ)
main.o: mytool1.h mytool2.h
mytool1.o: mytool1.h
mytool2.o: mytool2.h
.PHONY: clean
clean:
rm -f main $(OBJ)
改进三:自动变量($^ $< $@)的应用
Makefile 有三个非常有用的变量,分别是$@、$^、$<。代表的意义分别是:
$@--目标文件,
$^--所有的依赖文件,
$<--第一个依赖文件。
CC = gcc
OBJ = main.o mytool1.o mytool2.o
main: $(OBJ)
$(CC) -o $@ $^
main.o: main.c mytool1.h mytool2.h
$(CC) -c $<
mytool1.o: mytool1.c mytool1.h
$(CC) -c $<
mytool2.o: mytool2.c mytool2.h
$(CC) -c $<
.PHONY: clean
clean:
rm -f main $(OBJ)
三.文件的通用操作方法
1.open与creat
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
int creat(const char *pathname,mode_t mode);
打开或建立一个文件。对于open函数,仅当创建文件时,才用到第三个参数
打开成功,返回一个文件描述符的值,出错时返回-1
文件的打开标志flags用于设置文件打开后允许的操作方式:
只读O_RDONLY
只写O_WRONLY
读写O_RDWR
可选参数
O_APPEND 每次对文件进行写操作都追加到文件的尾端
O_CREAT 如果文件不存在则创建它,当使用此选项时,第三个参数mode需要同时设定,用来说明新文件的权限
O_EXCL 查看文件是否存在,如果同时制定了O_CREAT,而文件已经存在,则会报错
O_TRUNC 如果此文件存在,而且为只读或读写成功打开,则将其长度截短为0。
O_NOCTTY 如果pathname指的是终端设备,则不将该设备分配作为此进程的控制终端。
O_NONBLOCK 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文件的本次打开操作和后续的I/O操作设置非阻塞模式
mode:用下列一个或多个常量进行“或”运算构成mode参数(这些常量定义在sys/stat.h)
S_IRWXU:00700 拥有者读写执行权限
S_IRUSR: 00400 拥有者读权限S_IWUSR:00200 拥有者写权限
fd = open(filename,O_RDWR);
if(-1==fd)
printf("Open file %s failure!,fd:%d\n",filename,fd);//文件不存在
else{
printf("Open file %s sucess!,fd:%d\n",filename,fd);
}
建立一个空的test.txt
echo "">test.txt
注意:OCREAT与OEXCL结合使用可以编写容错的程序
/*O_CREAT与O_EXCL结合使用*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
int fd = -1;
char filename[]="test.txt";
//打开文件,如果文件不存在,则报错
fd = open(filename,O_RDWR|O_CREAT|O_EXCL,S_IRWXU);
if(-1==fd)//文件存在
{
printf("File %s exist!,reopen it",filename);
fd=open(filename,O_RDWR);
printf("fd:%d\n",fd);
}
else//文件不存在,创建并打开
{
printf("Open file %s success,fd:%d\n",filename,fd);
}
return 0;
}
2.close
#include <unistd.h>
int close(int fd);
close 关闭一个文件描述符,关闭以后此文件描述符不在指向任何文件,从而描述符可以再次使用,成功返回0,错误返回-1.
系统打开第一个文件的文件描述符的值为3
3.read
用read()函数从打开文件中读取数据,用户可以对读入的数据进行操作。
#include <unistd.h>
ssize_t read(int fd,void *buf,size_t count);
read()函数从文件描述符fd对应的文件中读取count字节,放到buf开始的缓冲区。
读取成功后,文件对应的读取位置指针,向后移动位置,大小为成功读取的字节数。返回读取的字节数。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
int fd=-1,i;
ssize_t size = -1;
char buf[10];
char filename[]="test.txt";
fd=open(filename,O_RDONLY);
if(-1==fd)
printf("Open file %s failure,fd:%d\n",filename,fd);
else{
printf("Open file %s success,fd:%d\n",filename,fd);
}
while(size)
{
size = read(fd,buf,10);//every time read 10 ge zi jie data
if(-1 == size){
close(fd);
printf("read file error occurs\n");
return -1;
}
else{
if(size > 0){
printf("read %d bytes:",size);
printf("\"");
for(i=0;i<size;i++)
printf("%c",*(buf+i));
printf("\"\n");
}
else{
printf("mowei size = %d",size);
printf("reach the end of file\n");
}
}
}
return 0;
}
4.write
向打开的文件中写入数据,将用户的数据保存到文件中
#include <unistd.h>
ssize_t write(int fd,const void *buf,size_t count);
当操作的对象是普通文件时,写文件的位置从文件的当前开始,操作成功后,写的位置会增加写入字节数的值。
如果在打开文件的时候指定了O_APPEND项,每次写操作之前,会将写操作的位置移到文件的结尾处。
cat主要有三大功能:
1.一次显示整个文件。$ cat filename
2.从键盘创建一个文件。$ cat > filename
只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件: $cat file1 file2 > file
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
int fd = -1,i;
ssize_t size = -1;
int input=0;
char buf[]="quick brown fox jumps over the lazy dog";
char filename[]="s.txt";
fd = open(filename ,O_RDWR);
if(-1==fd)
printf("Open file %s failure,fd:%d\n",filename,fd);
else
printf("Open file %s success,fd:%d\n",filename,fd);
size = write(fd,buf,strlen(buf));
printf("write %d bytes to file %s\n",size,filename);
close(fd);
return 0;
}
注意:要在写入前对文件进行清空,可以使用open()函数的O_TRUNC选项,将打开的函数修改为如下形式:
fd = open(filename , O_RDWR | O_TRUNC );
5.lseek()
可以设置文件偏移量的位置
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fildes,off_t offset,int whence);对文件操作符fildes所代表的文件,按照操作模式whence和偏移量的大小offset,重新设定文件的偏移量
操作成功返回新偏移量的值,失败返回-1。
文件偏移量可以为负值
参数whence和offset结合使用:
如果whence为SEEK_SET,则offset为相对文件开始处的值,即将该文件偏移量设为距文件开始处offset个字节
如果whence为SEEK_CUR, 则offset为相对当前位置的值,即将该文件的偏移量设为当前值加offset
如果whence为seek_end, 则offset为相对文件结尾的值,即将该文件的偏移量设置为文件长度加offset
获得当前的偏移量
off_t cur_pos = lseek(fd, 0, SEEK_CUR);
本文详细介绍了Linux环境下GCC编译器工具集的使用方法,包括编译单个文件、多文件编译、生成汇编语言、以及Makefile的编写技巧。同时,也对vim编辑器的基础操作进行了深入讲解,如普通模式和插入模式、移动光标、删除与复制粘贴等常用命令。此外,还介绍了文件的通用操作方法,包括open与creat、close、read、write和lseek函数的基本用法。
1521

被折叠的 条评论
为什么被折叠?



