*设备和文件IO(Linux内核函数)*****
一、一些基础概念
什么是gdb,openssh
实现跨平台,要安装一些包gdb,openssh ;
openssh 是实现跨平台开发。
gdb:是通过打断点的方式进行调试,把工程文件生成在unbuntu下,并不是真正运行。
工程文件在Linux/home/projects下,在windows下面只有.cpp文件,而linux下会有bin文件夹(里面是执行文件)等。
如何新建项?
右键工程文件,添加新项,添加类的话是.cpp和.h一起。
注意事项
-
打印时要加endl;
-
return的地方打上断点;
-
连接方式:NAT 主机虚拟机同网段ip,且主机的vmnet8要启动
-
验证登录的方式 ping
-
ping不通的原因
*不是同网段
*主机防火墙未关
-
include红线的原因
ip连不上虚拟机
虚拟机睡眠状态
因为include导入的头文件是unbuntu下的,所以如果ip连不上,虚拟机睡眠,都会出现红线。
解决方法:要在linux下,系统设置,设置亮度和锁屏,电源,然后重新连接unbuntu。
7.vs打印不了中文
原因:因为主机和unbuntu下的操作系统编码不一致,安装UTF-8,重新启动vs2019。
步骤:扩展 管理扩展 UTF-8
安装第一个插件,安装后重启vs2019
二、文件系统调用
Linux设备管理:Linux采用文件系统管理硬件设备。
eg.屏幕 蓝牙 网卡 键盘等等都是硬件 在window下要安装驱动 但是在linux下,是文件方式管理硬件,所有东西都是文件方式进行存储。
库函数和系统函数区别:
由上图可得知,库函数需要一个语言开发环境(函数库),而内核函数不需要环境,直接调用系统自带的函数。所以可总结为:
可移植性 | 效率 | |
---|---|---|
库函数 | 高 | 低 |
内核函数 | 低 | 高 |
查看内核函数的方法:
man xx or man 2 xx(具体哪个自行调试)
eg.
man write(NO)
man 2 write
eg.出现Linux Programmer’s Manual就是查对了
常见的关于文件操作的函数:
函数名 | 作用 |
---|---|
close | 关闭文件 |
open | 打开文件 |
write | 写 |
read | 读 |
常用的打开方式:
打开方式 | 功能 |
---|---|
O_RDONLY | 只读 |
O_WRONLY | 只写 |
O_RDWR | 读写 |
O_CREAT | 创建 |
O_APPEND | 追加 |
拷贝文件实例:
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
using namespace std;
int main()
{
int readfd = 0;//文件描述符fd
//一定要赋初值,一定要初始化
int wrifd = 0;//写
int res1 = 0;
int res2 = 0;
char buf[50] = {0};
umask(0);//设置umask为0000;
readfd = open("/root/projects/1.txt",O_RDONLY,0777);//0777不一定成功,
//umask,默认权限掩码0022,权限掩码减法,0777-0022=0755
wrifd = open("/root/projects/copy1.txt", O_CREAT | O_WRONLY, 0777);
if (readfd < 0 || wrifd <0)
{
perror("open file erro");//打印错误的方式
}
else
{
//参数:写哪个文件,写的内容,长度
//const 不可以修改 void* 不知道存进来的内容
//strlen 字符数 sizeof字节
while ( (res1=read(readfd,buf,sizeof(buf))) >0)
{
cout << "res1是" << res1 << endl;
res2 = write(wrifd, buf, res1);
cout << "res2是" << res2 << endl;
bzero(buf, sizeof(buf));
}
close(readfd);
close(wrifd);
}
return 0;
}