linux网络编程笔记,Linux网络编程学习笔记(一)

一、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_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 #include #include #include 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 int close(int fd); close 关闭一个文件描述符,关闭以后此文件描述符不在指向任何文件,从而描述符可以再次使用,成功返回0,错误返回-1. 系统打开第一个文件的文件描述符的值为3 3.read 用read()函数从打开文件中读取数据,用户可以对读入的数据进行操作。 #include ssize_t read(int fd,void *buf,size_t count); read()函数从文件描述符fd对应的文件中读取count字节,放到buf开始的缓冲区。 读取成功后,文件对应的读取位置指针,向后移动位置,大小为成功读取的字节数。返回读取的字节数。 #include #include #include #include #include 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 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 #include #include #include #include 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 #include 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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值