网站开发报价文件,wordpress看板猫,做盗版网站会坐牢吗,个人网站建设开题报告我的学习方法是#xff1a;Linux系统编程#xff08;看pdf笔记#xff09; Linux网络编程 WebServer
01P-17P Linux相关命令及操作 cp -a dirname1 dirname2 复制目录 cp -r dirname1 dirname2 递归复制目录 1 到目录 2 这里-a 和-r 的差别在于#xff0c;-a 是完全复制…我的学习方法是Linux系统编程看pdf笔记 Linux网络编程 WebServer
01P-17P Linux相关命令及操作 cp -a dirname1 dirname2 复制目录 cp -r dirname1 dirname2 递归复制目录 1 到目录 2 这里-a 和-r 的差别在于-a 是完全复制文件权限改动时间什么的也完全相同。 more filename 和 cat 差不多但是对于大文件查看很强势 head -n filename 查看文件前 n 行 tail -n filename 查看文件后 n 行 ln -s file file.s 创建一个软链接相当于win的快捷方式最好使用绝对路径 ln file file.h 创建一个硬链接文件和硬链接的 Inode 是相同的每个文件都有唯一的 Inode硬链接一改都改类似于cpp的引用 find命令 -type按种类-name按名字 grep 命令找文件内容 ,与ps配合使用ps aux | grep cupsd gzip 和 bzip2 都是压缩命令配合tar使用rar压缩需要安装rar。 ifconfig查看网卡信息
18P - 24P Vim相关一刷不看
25P-27P gcc相关
gcc中间文件及步骤 28P-37P 动态库和静态库
静态和动态的优劣静态库在文件中静态展开所以有多少文件就展开多少次非常吃内存但是这样的好处就是静态加载的速度快使用动态库会将动态库加载到内存10 个文件也只需要加载一次然后这些文件用到库的时候临时去加载速度慢一些但是很省内存。如何理解动态和静态静态的写在源代码里的函数相对 main 函数偏移是一定的链接时回填 main 函数地址之后其他源代码 里的函数也就得到了地址动态则用plt代替之后加载的时候再替换掉 编译器只能隐式声明返回值为 int 的函数形式int add(int ,int ) 如果函数不是返回的 int则隐式声明失效会报错在使用自己编写的静态库时需要在Main中加入函数声明 。但这个方法需要库的使用者知道库里的函数完事儿一个一个加到代码里不太行解决方法使用头文件加载静态库这样防止多次展开静态库带来额外开销。 38P-40P GDB调试跳过
41P-46P Makefile跳过
47P-51P 系统调用open
系统调用是内核提供的函数库调用是程序库中的函数open() 函数出错时程序会自动设置 errno可以通过 strerror(errno)来查看报错数字的含义 以打开不存在文件为例(如果成功fd会返回打开文件所得到对应的 文件描述符 52P-53P 系统调用read/write复制命令
系统调用write/read和库函数调用fgetc/fputc)的区别read每次写n个字节会疯狂进行内核态和用户态的切换所以非常耗时。fgetc/fputc有个缓冲区预读入缓输出机制。
54P 文件描述符
文件描述符是指向一个文件结构体的指针。在Linux中文件描述符是一个非负整数用于标识一个进程正在使用的文件或者其他输入/输出资源。每个进程都有一个文件描述符表其中存储了该进程打开的文件描述符。标准输入、标准输出和标准错误输出分别使用文件描述符0、1和2。其他文件描述符从3开始递增。文件描述符可以用于读取、写入、关闭文件以及进行其他文件操作。标准输入输出一般指的就是键盘输入/输出
55P 阻塞和非阻塞
阻塞/非阻塞是设备文件、网络文件的属性常规文件没有阻塞的概念。比如读取dev/tty 这也是个文件如下写法就是阻塞的
/* 使用阻塞的read读取终端标准输入输出*/
#include unistd.h
#include stdlib.h
#include stdio.hint main(){char buf[10];int n;n read(STDIN_FILENO, buf, 10);if(n 0){perror(read STDIN_FILENO);exit(1);}write(STDOUT_FILENO, buf, n);return 0;
}56P-57P 系统调用fcntl
fcntlfile control是一个系统调用用来改变一个【已经打开】的文件的访问控制属性函数声明int fcntl(int fd, int cmd, ... /* arg */ ); cmd表示命令比如下面这句代码将阻塞改为非阻塞其中F_SETFL设置F_GETFL获取 flags fcntl(STDIN_FILENO, F_GETFL); //获取 stdin 属性信息if(flags -1){perror(fcntl error);exit(1);}flags | O_NONBLOCK;int ret fcntl(STDIN_FILENO, F_SETFL, flags);if(ret -1){perror(fcntl error);exit(1);}58P 系统调用lseek
lseek函数通常用于随机访问文件例如读取文件中的某个特定位置的数据。函数声明
#include unistd.hoff_t lseek(int fd, off_t offset, int whence);
fd是文件描述符offset是偏移量whence是偏移量的起始位置。whence可以取以下三个值之一
- SEEK_SET偏移量相对于文件开头。
- SEEK_CUR偏移量相对于当前位置。
- SEEK_END偏移量相对于文件末尾。返回值是新的文件偏移量-1表示错误
常用作用使用lseek 获取文件大小、配合truncate拓展文件大小使用lseek获取文件大小的例子
#include unistd.h
#include fcntl.h
#include stdio.h
#include stdlib.hint main(int argc, char *argv[]) {if (argc ! 2) {fprintf(stderr, Usage: %s filename\n, argv[0]);exit(1);}int fd open(argv[1], O_RDONLY);if (fd -1) {perror(open error);exit(1);}off_t size lseek(fd, 0, SEEK_END);if (size -1) {perror(lseek error);exit(1);}printf(File size: %ld bytes\n, size);close(fd);return 0;
}59P 传入传出参数
传入参数 1. 指针作为函数参数。 2. 同常有 const 关键字修饰。 3. 指针指向有效区域 在函数内部做读操作。
传出参数 1. 指针作为函数参数。 2. 在函数调用之前指针指向的空间可以无意义但必须有效。 3. 在函数内部做写操作。 4。函数调用结束后充当函数返回值。
传入传出参数 1. 指针作为函数参数。 2. 在函数调用之前指针指向的空间有实际意义。 3. 在函数内部先做读操作后做写操作。 4. 函数调用结束后充当函数返回值。
60P 目录和inode
inode它是文件系统中的一个数据结构用于存储文件的元数据信息。每个文件在文件系统中都有一个唯一的inode号码通过这个号码可以访问文件的元数据信息例如文件的权限、所有者、大小、创建时间、修改时间等等。在Linux文件系统中文件名和inode号码是分开存储的。文件名存储在目录中而inode号码存储在文件系统的inode表中。一个文件主要由两部分组成dentry(目录项)和 inode。所谓的删除文件就是删除 inode但是数据其实还是在硬盘上以后会覆盖掉。参考某些数据恢复措施