孤单总是难免的

导航

 
//openSSH-server 远程服务器
//dpkg -s openssh-server 检查是否安装
//sudo apt-get install openssh-server 安装
//linux 终端访问
//IP addr 查看ip地址 通过 MobaXterm 软件来访问。。
//Remote host : ip 地址 填写就行

//shell 壳命令
//$ # 命令输入提升
//## - 注释
//tab 键可以补全

//sudo su 普通用户到特权用户
//su 用户名 切换到普通用户

//pwd 显示当前文件的路径
//cd 目录名 进入到目录名的目录
//cd .. 移动到上一级目录
//cd / 进入到根目录
//cd 进入到自己的子目录

//ls 显示当前目录下的文件和目录
//ls - l 查看文件的各种属性

//mkdir 目录名 // 创建目录
//touch 文件名 // 创建文件


//mv 文件名 目录名/换名字
//mv 文件名 ../ 移动到上一级目录
//cp 文件名 目录名/
//cp 文件名 ../ //移动到上一级目录
//rm - fr 目录名 // 删除目录
//rm 文件名 删除文件


//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 语法高亮

//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 vim /etc/samba/smb.conf //进入samba 目录 .conf 是配置文件

//[Share]
//comment = This is samba dir
//path = / home / 一定要设置
//writable = yes
//browseable = yes

//smbpasswd -a 用户 //增加 sab 的密码
//systemctl stop smbd nmbd // 关闭samba 服务
//systemctl start smbd nmbd // 开启samba 服务

//vs2019 开发linux 环境 vs2019 支持远程开发linux
//vs 中设置 工具->选项->跨平台->链接管理器
//主机名 ip地址
//端口 22
//用户名 linux的用户名
//密码 linux 的密码
/*
服务器端:
int sock=socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr= htonl(INADDR_ANY);
server_addr.sin_port = htons(666);
bind(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));
listen(sock, 128);
accept(sock, (struct sockaddr*)&client, &client_addr_len);
close

服务器端
套接字:
地址结构体
绑定
监听
接收
关闭

bzero 清0
memset 内存设置
inet_pton 字符串转网络地址
inet_ntop 网络地址转字符串 /inet_ntoa= inet_ntop
ntohl 网络字节序转主机 长
ntohs 网络字节序转主机 短
htonl 主机字节序转网络 长
htons 主机转网络字节序 短
AF_INET IPv4地址
SOCK_STREAM TCP 协议
INADDR_ANY 任意地址


客户端:
socket(AF_INET, SOCK_STREAM, 0);套接字
struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(666);
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);

connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
close(sockfd);
*/


/*
出错处理:
//void perror_exit(const char* des) {
// fprintf(stderr, "%s error, reason: %s\n", des, strerror(errno));
// perror(des);
// exit(1);
//}
//int main(void) {
// int sock = socket(AF_INET, 0, 0);
// if (sock == -1) {
// perror_exit("create socket");
// }
// return 0;
//}
*/
/*
0:标准输入,对应于已打开的标准输入设备(键盘)
1:标准输出,对应于已打开的标准输出设备(控制台)
2. 标准错误, 对应于已打开的标准错误输出设备(控制台)

write
read
open
close

lseek(fd, 0, SEEK_END);
fd 文件句柄
0 相当于参数3偏移多少字节
SEEK_END 文件末尾
SEEK_CUR 当前位置
EEK_SET 文件开头

系统调用 应用程序与内核交互的接口
实现系统调用的方法:
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 将所有修改过的块缓冲区排入写队列,
然后就返回,它并不等待实际写磁盘操作结束。

文件锁
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;锁的长度(0 = 锁整个文件)
pid_t l_pid; // 持有锁的进程ID(一般不用手动填)
}
fcntl 文件控制函数
int fcntl(int fd, int cmd, struct flock* lock)
fd //文件句柄
cmd
F_GETLK 查询域锁状态 只要没上锁都是 lock.type= F_UNLCK
F_SETLK 不阻塞解锁
F_SETLKW: 阻塞加锁(最常用) lock.type = F_WRLCK
struct flock* lock的地址


文件状态:
struct stat{ st
st_mode 文件类型
}
stat(const char *path, struct stat *buf) 获取文件/目录的详细属性信息。
S_ISDIR(st.st_mode)是否是目录
fileno(File*); 取出文件描述符
fstat(fd, &st)获取文件元信息(大小、权限、类型、修改时间等)
st.st_size 文件的大小
*/
/*
CMakeList.txt->cmake -> makefile ->make
gdb 调试
g++ a.cpp -o a -g
gdb  a
break  m.cpp:行号
info b 查看断点
clear 行号 清除断点
next 卓语句往下走
s 进入函数内部
quit 退出

Coredump 调试 适用于程序崩溃
echo /home/lz/projects/Project1/core.%e.%p >/proc/sys/kernel/core_pattern(固定)
ulimit -c unlimited
查看:
gdb a core.a.49360
*/

/*
内存泄露:
安装 Valgrind
g++ test.cpp -o 你的程序 -g
valgrind ./你的程序
*/

/*gtest
#include <limits.h>
#include <gtest/gtest.h>
namespace {
TEST(a, testEQ) {
EXPECT_EQ(1, 1); //期待 相等
EXPECT_GT(1, 0); //预期 左边 > 右边
}
TEST(aa, bb) {
EXPECT_FALSE(false);//预期 false
EXPECT_TRUE(true); //预期 true
}
}
g++ a.cpp -o a -lgtest -lgtest_main -lpthread
#include <gtest/gtest.h>
int main(int argc, char** argv){
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
*/

/*
项目配置:
https://github.com/ndevilla/iniparser
sudo apt update
sudo apt install libiniparser-dev
iniparser_load(path.c_str());//加载文件
g++ *.cpp -o a -liniparser
*/

/*
Log4cpp
g++ a.cpp -o a -llog4cpp -pthread

#DEBUG < INFO < NOTICE < WARN < ERROR < FATAL 所有都会输出
log4cpp.rootCategory=DEBUG, aa
#log4cpp 内置滚动文件输出器
log4cpp.appender.aa=RollingFileAppender
#指定输出格式与ConversionPattern 连用
log4cpp.appender.aa.layout=PatternLayout
log4cpp.appender.aa.layout.ConversionPattern=%d{%m-%d %H:%M:%S %l}[%t][%p]%m%n

#输出路径
log4cpp.appender.aa.fileName=/home/lz/projects/Project1/aaa.log
log4cpp.appender.aa.maxFileSize=268435456 #256MB
log4cpp.appender.aa.fileNamePattern=aaa%i.log
log4cpp.appender.aa.maxBackupIndex=256
*/



/*
进程:
pid_t 进程 ID 类型
fork(); 创建进程 ==0 子进程 >0 父进程
getpid() 获取自己的进程id
exit()
wait()阻塞当前进程,直到任意一个子进程结束;

lscpu 查看cpu 有几个壳
cpu_set_t cpu; //  CPU 亲和性。
CPU_ZERO(&cpu);// 清0
CPU_SET(1, &cpu);//把编号为 1 的 CPU 核心加入 CPU 集合。
sched_setaffinity(0, sizeof(cpu_set_t), &cpu);
//把当前进程绑定到cpu的壳上


孤儿进程:父进程退出,子进程还在
僵尸进程:子进程执行完毕退出,但父进程没有调用 wait ()
守护进程:
#include <fcntl.h>
#include <unistd.h>
int asd()
{
switch (fork()) {
case 0:
break;
default:
_exit(0);
}
setsid();
(void)chdir("/");
int fd = open("/dev/null", O_RDWR, 0);
C(fd, STDIN_FILENO);
(void)dup2(fd, STDOUT_FILENO);
(void)dup2(fd, STDERR_FILENO);
(void)close(fd);
return (0);
}
*/
posted on 2021-05-12 16:29  孤单总是难免的  阅读(154)  评论(0)    收藏  举报