//linux 资源
//http ://www.mysqlab.net/documents/linux_c/ 一些简单接口的解释
//https://www.chinastor.cn/manuals/linuxfunctions/
//openSSH-server 远程服务器
//dpkg -s openssh-server 检查是否安装
//sudo apt-get install openssh-server 安装
//linux 终端访问
//IP addr 查看ip地址 通过 MobaXterm 软件来访问。。
//Remote host : ip 地址 填写就行
//shell 壳命令
//$ # 命令输入提升
//## - 注释
//tab 键可以补全
//man 命令 帮助
/// usr / share / man / man1 普通命令和应用程序
/// usr / share / man / man2 系统调用
/// usr / share / man / man3 库调用,主要是libc()函数的使用文档
/// usr / share / man / man4 设备驱动和网络协议
/// usr / share / man / man5 文件的详细格式信息
/// usr / share / man / man6 游戏
/// usr / share / man / man7 文档使用说明
/// usr / share / man / man8 系统管理命令
/// usr / share / man / man9 内核源代码或模块的技术指标
//# man 手册编号 (可选) 查找的函数名(ping / read)
//sudo su 普通用户到特权用户
//su 用户名 切换到普通用户
//pwd 显示当前文件的路径
//cd 目录名 进入到目录名的目录
//cd .. 移动到上一级目录
//cd / 进入到根目录
//cd 进入到自己的子目录
//ls 显示当前目录下的文件和目录
//ls - l 查看文件的各种属性
//mkdir 目录名 // 创建目录
//touch 文件名 // 创建文件
//rm - fr 目录名 // 删除目录
//rm 文件名 删除文件
//mv 文件名 目录名/换名字
//mv 文件名 ../ 移动到上一级目录
//cp 文件名 目录名/
//cp 文件名 ../ //移动到上一级目录
//cat 文件名 //查看文件的内容
//ln 文件的硬链接
//ln xx hh;
//xx是一个文件。。通过ln创建一个文件hh
//文件hh 和xx 是同一个文件。。指向磁盘的同一个位置。
//删除xx后 hh还在
//修改其中一个文件的数据。。2个文件的数据都要着改变,。。。。
//ln - s 文件的软链接
//ln - s xx hh
//xx是一个文件。。通过ln - s
//创建一个文件hh 文件hh 是xx 的别名.......
//指向磁盘的同一个位置。删除xx后hh 也跟着删除
//修改其中一个文件的数据。。2个文件的数据都要着改变,。。。。
//文件的权限命令
//d 表示目录
//l 表示链接
//- 表示什么都没有 普通文件
//r 表示读 w 表示写 x 执行
//改变属于组
//chown root 文件名 // 改变用户
//chown : root 文件名 //改变属组
//chown root : root 文件名 //改变用户 属组
//改变权限
//a 所有 u用户 g属组 o其它组
//chmod a + x 文件名 //加执行权限
//chmod a - x 文件名 //减执行权限
//vi 编辑文本
// i 在光标所在位置插入
// esc // 退出
// :w 保存 不退出
// :q 不保存 退出
// :wq 保存 退出
// :q! 强行退出,放弃保存
// :wq!强行保存,强行退出。
// set number 设置行号
// syntax enable 语法高亮
//linux 编译第一个程序
//gcc 是c语言的编译器 不能编译c++
//gcc 文件名 //编译文件 默认产生执行的 a.out 文件
//gcc 文件名 - o xx.exe //产生 xx.exe的执行文件
//g++ 是c++的编译器 //能编译c 语言 又能编译 c++
//g++ 文件名 - o xx.exe.exe 后缀可写可不写
//执行可以执行的文件 . / 文件名(后缀)
//Samba file server 文件共享服务器
//sab 服务只能用于局域网
//确认安装 : dpkg - s | grep samba 不能显示源码安装
// 安装: sudo apt - get install samba
// 卸载: sudo apt purge package_name
// sudo apt autoremove
// sudo vi /etc/samba/smb.conf //进入samba 目录 .conf 是配置文件
//[Share]
//comment = This is samba dir
//path = / home / 一定要设置
//writable = yes
//browseable = yes
//smbpasswd -a lizhi //增加 sab 的密码
//service samba stop // 关闭samba 服务
//service samba start // 开启samba 服务
//vs2019 开发linux 环境 vs2019 支持远程开发linux
//vs 中设置 工具->选项->跨平台->链接管理器
//主机名 ip地址
//端口 22
//用户名 linux的用户名
//密码 linux 的密码
/*
记忆
sudo su 普通用户到特权用户
su 用户名 切换到普通用户
pwd 显示当前文件的路径
cd 目录名 //进入到目录名的目录
cd .. 移动到上一级目录
cd / 进入到根目录
cd 进入到自己的子目录
ls 显示当前目录下的文件和目录
ls - l 查看文件的各种属性
mkdir 目录名 // 创建目录
touch 文件名 // 创建文件
rm - fr 目录名 // 删除目录
rm 文件名 删除文件
mv 文件名 目录名/换名字 使用相对路径
mv 文件名 ../ 移动到上一级目录
cp 文件名 目录名/ //使用相对路径
cp 文件名 ../ //移动到上一级目录
cat 文件名 //查看文件的内容
ln xx hh //文件的硬链接
ln - s xx hh //文件的软链接
d 表示目录 文件的权限命令
l 表示链接 文件的权限命令
- 表示什么都没有 普通文件 文件的权限命令
r 表示读
w 表示写
x 执行
chown root : root 文件名 //改变用户 属组
chmod a + x 文件名 //加执行权限
chmod a - x 文件名 //减执行权限
gcc 文件名 - o xx.exe //产生 xx.exe的执行文件
g++ 文件名 - o xx.exe.//exe 后缀可写可不写
./ 文件名 执行可以执行的文件
*****************************************************************
普通用户到特权用户
切换到普通用户
显示当前文件的路径
进入到目录名的目录
移动到上一级目录
进入到根目录
进入到自己的子目录
显示当前目录下的文件和目录
查看文件的各种属性
创建目录
创建文件
删除目录
删除文件
移动文件到下级目录
移动到上一级目录
查看文件的内容
文件的硬链接
文件的软链接
表示目录 文件的权限命令
表示链接 文件的权限命令
表示什么都没有 普通文件 文件的权限命令
表示读
表示写
执行
文件权限改变用户 属组
加执行权限
减执行权限
产生 xx.exe的执行文件
执行可以执行的文件
*/
//#include <stdio.h>
//#include <unistd.h>
//#include <sys/types.h>
//#include <sys/socket.h>
//#include <string.h>
//#include <ctype.h>
//#include <arpa/inet.h>
//#include <iostream>
//using namespace std;
//#define SERVER_PORT 666
//int main(void) {
//
// int sock = socket(AF_INET, SOCK_STREAM, 0);
// //1 信箱
// struct sockaddr_in server_addr;
// //2 标签
// bzero(&server_addr, sizeof(server_addr));
// server_addr.sin_family = AF_INET;
// server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// server_addr.sin_port = htons(SERVER_PORT);
//
//
// bind(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));
// //3 绑定
//
// listen(sock, 128);
// //4 监听
//
// printf("waited kehuduan \n");
// while (1) {
//
// struct sockaddr_in client;
// socklen_t client_addr_len = sizeof(client);
// int new_sock = accept(sock, (struct sockaddr*)&client, &client_addr_len);
// //5 接收
//
// char client_ip[64];
// cout << inet_ntop(AF_INET, &client.sin_addr.s_addr,
// client_ip, sizeof(client_ip)) << endl;
// cout << ntohs(client.sin_port) << endl;
//
// char buf[256];
// int len = read(new_sock, buf, sizeof(buf) - 1);
// buf[len] = '\0';
// cout << buf << endl;
//
// len = write(new_sock, buf, len);
//
// close(new_sock);
// }
// close(sock);
// return 0;
//}
//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//#include <unistd.h>
//#include <sys/socket.h>
//#include <netinet/in.h>
//
//#define _666 666
//#define _192 "192.168.67.129"
//int main() {
//
// int sockfd = socket(AF_INET, SOCK_STREAM, 0);
//
// struct sockaddr_in servaddr;
// memset(&servaddr, 0, sizeof(struct sockaddr_in));
// servaddr.sin_family = AF_INET;
// inet_pton(AF_INET, _192, &servaddr.sin_addr.s_addr);
// servaddr.sin_port = htons(_666);
//
// connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
//
// char* message = "aaaaaaa";
// write(sockfd, message, strlen(message));
// char buf[64];
//
// int n = read(sockfd, buf, sizeof(buf) - 1);
// //阻塞程序
// buf[n] = '\0';
// cout << buf << endl;
// close(sockfd);
// return 0;
//}
/*
bzero 清0
socklen_t 保存struct sockaddr_in的长度
htonl 主机转网络长
htons 主机转网络短
ntohs 网络转主机短
ntohl 网络转主机长
inet_ntop 网络转字符串
inet_pton 字符串转网络
AF_INET IPv4地址
SOCK_STREAM TCP协议
INADDR_ANY 所有地址
memset 内存全部设置成指定值
服务器端:6
socket 1信箱
struct sockaddr_in a 2标签
a.sin_family;
a.sin_addr.s_addr;
a.sin_port;
bind 3绑定
listen 4监听
accept 5接收
close
客户端: 4
socket 信箱
struct sockaddr_in b; 标签
connect 连接
close
*/
/*
清0
保存struct sockaddr_in的长度
主机转网络长
主机转网络短
网络转主机短
网络转主机长
网络转字符串
字符串转网络
IPv4地址
TCP 协议
所有地址
内存全部设置成指定值
服务器端:6
客户端:4
*/
//#include <errno.h>
//#include <string.h>
//char* strerror(int errnum) {
// cout << strerror(errnum) << endl;
//}
//0:标准输入,对应于已打开的标准输入设备(键盘)
//1:标准输出,对应于已打开的标准输出设备(控制台)
//2. 标准错误, 对应于已打开的标准错误输出设备(控制台)
//ps - ef | grep xx 显示所有进程的信息
// int a = write (int fd ,buf,sizeof(buf));
//成功 返回写入的字节数 失败返回 -1
// int a =read (int fd ,buf,sizeof(buf));
//成功 返回读取的字节数 失败返回 -1
//int open(const char *pathname, int flags, mode_t mode);
//pathname 文件路径
//flags 打开方式 中间可以用 | 累加
//O_RDWR 读写
//O_CREAT 如果文件不存在,则创建该文件,
// 如果文件存在 ,则只打开文件
//O_EXCL 如果同时使用O_CREAT而且该文件又已经存在时,
// 则返回错误, 用途:以防止多个进程同时创建同一个文件
//mode 文件权限 0666
//close (int fd ) 返回值 成功: 0 失败: - 1
//time . / a.out
//补充:time命令 查看程序所用的时间
//time命令分别输出 :
//real - 程序总的执行时间
//usr - 该程序本身所消耗的时间
//sys - 系统调用所消耗的时间
//lseek 控制文件的指针
//off_t lseek(int fd, off_t offset, int whence);
//fd 文件句柄
//offset 偏移多少字节
//whence 从什么位置开始读
//EEK_SET 将读写位置指向文件头后再增加offset个位移量。
//SEEK_CUR 以目前的读写位置往后增加offset个位移量。
//SEEK_END 将读写位置指向文件尾后再增加offset个位移量。
//(2) 返回值
//成功:返回新的文件位置与文件头之间偏移
//失败: - 1
//系统调用 应用程序与内核交互的接口
//实现系统调用的方法:
//1. glibc库函数 open read...//高效
//int rc = chmod("./test.txt", S_IWUSR | S_IWGRP | S_IWOTH);
// chmod 修改文件的权限
//2.syscall 调用 使用不方便
//int rc = syscall(SYS_chmod, "./test.txt", S_IROTH |
// S_IRGRP | S_IRUSR);
//SYS_chmod 系统调用号
//如何高效的执行系统调用
//1. 避免重复的系统调用 2.多使用 glibc库函数
//io // 输入 输出
//间接io // write 访问文件要经过 内存io 再到 物理io(磁盘)
//直接io
// open(O_DIRECT) 不用 直接将数据传输至磁盘设备,
// 避免多层缓存带来的性能损耗。
// open(O_SYNC) 不用 即数据写入文件系统缓冲区后,
// 必须等待物理存储设备完成数据写入才返回操作结果
// int fsync(int fd); 同步内存中的文件数据到储存设备。
// 成功返回0失败返回-1
//使用方法 : write(fd, buf, size(buf)) 后面加上 fsync(fd)
//fdatasync 类似fsync,但只影响文件的数据部分。
// 而除数据外,fsync 还会同步更新文件属性。
//sync 将所有修改过的块缓冲区排入写队列,
//然后就返回,它并不等待实际写磁盘操作结束。
//文件锁
//#include <unistd.h>
//#include <fcntl.h>
//struct flock {
// short l_type; 锁的类型(如共享锁、排他锁)
// F_RDLCK读锁
// F_WRLCK写锁
// F_UNLCK 解锁
// short l_whence; 锁定的起始位置(如文件开头、当前位置、文件末尾)
// SEEK_SET:以文件开头为锁定的起始位置
// SEEK_CUR:以目前文件读写位置为锁定的起始位置
// SEEK_END:以文件结尾为锁定的起始位置
// off_t l_start; 锁定位置的偏移量
// 相对于 l_whence 偏移多少个字节开始
// off_t l_len; 锁定区域的大小(以字节为单位)
// 从l_start算起对文件多长的内容加锁。
// 0,表示一直加锁到文件的末尾
// pid_t l_pid;
// 持有锁的进程 ID(在某些实现中返回)
//};
//fcntl 用来操作文件描述词的一些特性
//int fcntl(int fd, int cmd, struct flock* lock)
//fd //文件句柄
//cmd
// F_GETLK 取得文件锁定的状态
// F_SETLK 设置文件锁定的状态
//lock struct flock 的地址
//getpid(); 返回进程的id
//创建线程的函数
//pthread_t tid;
//pthread_create(&tid, NULL, xxx, (void*)a);
/*
0:标准输入
1:标准输出
2. 标准错误
write (int fd ,buf,sizeof(buf)); 写
read (int fd ,buf,sizeof(buf)); 读 堵塞
int open(const char *pathname, int flags, mode_t mode); 打开
close (int fd ) 关闭
time . / a.out 查看程序所用的时间
lseek 控制文件的指针
int fsync(int fd); 同步内存中的文件数据到储存设备。
使用方法 : write(fd, buf, size(buf)) 后面加上 fsync(fd)
文件锁
struct flock {
};
int fcntl(int fd, int cmd, struct flock* lock)
ps - ef | grep xx 查看指定进程的信息
进程 是操作系统分配资源(如内存、文件句柄)的最小单位
getpid(); 返回进程的id
线程 是CPU调度的最小单位
pthread_t tid; 线程唯一标识符
pthread_create(&tid, NULL, xxx, (void*)a);//创建线程的函数
*/
/*
标准输入
标准输出
标准错误
写
读
打开
关闭
查看程序所用的时间
控制文件的指针
同步内存中的文件数据到储存设备。
文件锁
查看指定进程的信息
返回进程的id
线程唯一标识符
创建线程的函数
*/