📄 unix c++ day01 笔记.txt
字号:
unix C++ day01 笔记
五天的课程计划:
第一天:文件系统
第二天:多进程
第三天:进程间通信
第四天:网络介绍
第五天:网络通信实战
unix下编程习惯 1、返回整数时 成功返回 0(>0),失败返回-1(<0)
2、返回指针时 成功返回正常指针(非空),失败返回空指针(NULL)
3、数据类型: xxxx_t 表示整数
4、要取得数据先准备好存放数据的地方:int getxxx( X* buf , ...)
例:char* buf; | chr buf[20];
buf=new char[20];
getname(buf);
显示主目录(主路径)的命令:pwd , echo $HOME
显示所有环境变量:env 或 set
每个用户都有一个uid,至少属于一个组
取得环境变量:int main(int argc,char* argv[],chr* env[]); (参看课堂代码env.cc)
每个指针指向一个环境变量字符串,以NULL为结束
如果一个指针数组没有告诉元素个数,一定用NULL作为这个数组的结束标记
取得某个环境变量的值:char* getenv(const char* name) (参看课堂代码getenv.cc)
参数是环境变量的名字,正确返回环境变量的值,出错返回NULL
头文件<cstdlib>或<stdlib.h>
例:char* p=getenv("PATH");
修改环境变量的值:int putenv(const char* str);
参数是新的环境变量和值,正确返回0,出错返回-1
头文件<cstdlib>或<stdlib.h>
例:putenv("MYVAR=GOOD");
设置的环境变量只对本进程或子进程有效,当前工作目录也只对本进程或子进程有效
进程:一份正在执行的程序
ps -ef 查看系统中运行的所有进程 PID就是进程id
ps 查看当前终端运行的程序
ps -l 查看进程运行的状态
常见状态:O 正在运行
S 睡眠,等待调度
R 已装载,准备就绪,可以运行
Z 僵死进程,已结束但不释放资源
T 已停止,挂起状态,处于挂
ps -f -p 进程号 查看此进程的父进程
init的进程id总是1
用户信息操作函数: (参看课堂代码getenv.cc)
头文件:<unistd.h>
char* getlogin(); 得到用户登录名
int getuid(); 得到当前登录用户的用户ID号
int geteuid(); 得到当前运行该进程的有效用户ID
头文件:<pwd.h>
struct passwd* getpwuid(int userid); 根据用户ID取得用户的完整信息,返回一个指向passwd的结构指针
struct passwd* getpwnam(const char* username); 根据用户名取得用户的完整信息
用户组信息操作函数:
头文件:<unistd.h>
int getgid(); 得到当前登录用户组的ID
int getegid(); 得到当前运行:该进程的有效用户组ID
头文件:<grp.h>
struct group* getgrgid(int groupid); 根据一个组ID取得这个组的信息(不一定是完整的)
文件系统:
任何操作系统的文件都是树形结构。
绝对路径-----以根开头的路径为绝对路径
相对路径-----以当前目录为出发点的路径
目录操作:(参看课堂代码:directory.cc)
创建一个新的目录:
int mkdir(const char* name,int mode);
name---目录名
mode---权限
头文件<sys/stat.h>
成功返回0(大于0),失败返回-1(小于0)
删除一个目录:
int rmdir(const char* name);
name---目录名
头文件<unistd.h>
成功返回0(大于0),失败返回-1(小于0)
取得当前工作目录:(参看课堂代码getcwd.cc)
char* getcwd(char* buf,int size);
头文件<unistd.h>
buf用于存放结果,把取得的当前工作目录放到buf指向的地方,
buf是事先准备好的空间地址,必须指定大小
size是buf的长度,如果buf的长度是len,size通常传len-1,留一个存放'\0'
返回类型与buf中的内容是一致的
改变当前工作目录:
int chdir(const char* name);
头文件<unistd.h>
name是新目录名
成功返回0(大于0),失败返回-1(小于0)
打开一个目录:头文件<dirent.h>
DIR* opendir(const char* dirname);
用一个DIR指针来代表这个目录
读取目录中的一个目录项:
struct dirent* readdir(DID* dirp);
每次读取目录中的一个目录项
根据返回指针是否为空判断是否读完
dirent结构中,d_name成员用于保存目录项的名称。
关闭一个被打开的目录:
int closedir(DIR* dirp);
文件操作:
打开文件:int open(const char* pathname,int flag,...);
头文件<fcntl.h>,<sys/stat.h>,<sys/types.h>
pathname是一个文件的全名(包含文件路径)
flag这是一个表示文件打开方式的值,它只能从几个特定的值中选择
(O_RDONLY只读模式,O_WRONLY只写模式,O_RDWR读写方式)这三种方式必选其一其只能选一个
O_APPEND,追加方式,
O_CREATE如果文件不存在就创建,这个模式需要额外提供一个文件权限的参数
O_EXCL独占模式需和O_CREATE联合使用,
O_TRUNC打开文件同时清空内容
open函数返回值:是一个文件描述符,如果其小于0旧表示文件打开操作失败。
例:int fd=open(argv[1], O_WRONLY|O_CREAT, 0666);
读文件:size_t read(int fd,void* buf,size_t nbytes)
头文件<unistd.h>
fd是由open函数返回的文件描述符,表示读哪个文件
buf用于存储读入的数据,即从文件中读的数据放到哪里,在使用read前要为其申请空间
nbytes要读多少字节的数据
返回值:如果执行成功,返回一个>0的整数,表示本次读取操作实际读入的字节数,失败返回-1
写文件:size_t write(int fd,void* buf,size_t nbytes);
头文件<unistd.h>
fd是由open函数返回的文件描述符,表示读哪个文件
buf用于存储要写入文件的数据,即要写的数据在哪里
nbytes想写入文件多少字节的数据
返回值:如果执行成功,返回一个>0的整数,表示本次实际写入的字节数,失败返回-1
关闭文件:int close(int fildes);
头文件<unistd.h>
fildes是文件描述符
文件描述符:由系统内核产生,非负整数,shell产生三个标准文件描述符(0,1,2)对应于(cin,cout,cerr),cin,cout可以重定向,cerr不能重定向
修改与fd对应的文件中文件偏移量的值,动态调整文件指针:
off_t lseek(int fd,off_t offset,int whence)
fd文件描述符,
offset文件偏移量,
whence移动策略(以哪里为基准)
SEEK_SET,文件首,偏移量需为非负,
SEEK_CUR,文件当前位置,
SEEK_END文件尾,偏移量需为负值
返回值:成功返回>0的整数,表示挪动的字节数,失败返回<0的数
注意如果偏移量的设置不正确会遭成文件空洞
文件权限判断:
int access(const char* path,int amode)
path:文件名
amode:判断的模式,R_OK,读权限 W_OK,写权限 X_OK,执行权限 F_OK,文件是否存在
返回值为0或大于0操作成功,小于0操作失败。
作业: 1、写一个程序,在当前用户的主目录下建一个子目录名叫data,权限0755,
在这个子目录中建一个文件a.txt,在文件中写一些数据,如:hello,UNIXC!
2、写一个程序,实现产生不重复的id
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -