--------------------------------------------------------------------------
第一天: 文件系统
--------------------------------------------------------------------------
1. UNIX环境下的环境变量:
1. 用env 命令:
2. 在程序中查看环境变量, int main(int argc,char* argv[],char* env[])
int argc //命令行上字符串的个数
char* argv[], //分别指向命令行上的各个字符串
char* env[] //每个指针指向一个环境变量的字符串; (不计算有几个字符串, 但是在UNIX环境下有处理的方法: 在最后一个的后面写一个指针,NULL为结束条件)
------------------------------------------------------------------------------
srtncmp(env[i],"比较的字符",要比几个字符(int 型)) //比较两个字符串的前N个字符:
getenv(const char* name) //取得指定的环境变量.返回指向内容的指针:
-------------------------------------------------------------------------------
#include <iostream>
using namespace std;
int main(int argc,char* argv[],char* env[])
{
for(int i=0;env[i]!=null;i++){ //直到为NULL结束;
if(srtncmp(env[i],"PATH=",5)==0) //查找指定的环境变量:
cout<<env[i]<<endl;
}
}
------------------------------------------------------------------------------
#include <iostream>
#include <stdlib.h> //最好加上.
using namespace std;
int main(int argc,char* argv[],char* env[])
{
char* p=getenv("PATH"); //
// 如果一个函数的返回类型是指针则其返回类型是NULL; 如果不存在返回 NULL;
if(p==NULL)
cout<<"not found PATH"<<endl;
else
court<<*p<<endl;
}
}
2--------------------------------------------------------------------------------
putenv()//可能成功,也可能不成功.因此不建议用它
setenv("设置环境变量名","值",是否覆盖); //建议用这个函数;
man 用户命令 //(User Command), 在第一章
C++标准库函数 //(Standard C++ Library Funciton) , 在第二章
系统调用 //(System Calls) 由UNIX 系统提供的,其他系统不能用. 在第三章 (3C)
User Comannd //标题;
mkdir(1) "1" : 表示在第几章;
man -a setenv; // 查找所有的包括这个关键字的 [用户命令,标准C++库函数, 或者系统调用] ;
*************************************************************************
*
*UNIX下的几个习惯:
*1.如果一个函数的返回类型是指针则其返回类型是NULL; 如果不存在返回 NULL;
*2.如果返回类型是整数: 如果成功返回非负数, 失败返回负数一般是: -1
*
*************************************************************************
perror("提示: "): 知道到底是哪个错误在屏幕上. 示例: "提示: ................................."
man -s3C mkdir //指定要查找哪一章的内容.
man -k dir //根据关键子来查找(模糊查找) 列出跟关键子相关的内容.
man
---------------------------------------------------------------------------------
2: 进程:
ps -u 295 //查找用户的所有进程;
T : 暂停状态; fg %1 恢复状态; bg %1 a.out& 后台执行
S : 睡眠状态;
O : oneline 正在执行的状态
R : 可执行状态 在进程堆里等待
Z : 僵尸进程
----------------------------------------------------------------------------------
3.用户信息:
#include <unistd.h> //要导入的头文件
char* getlogin() //得到用户的登录名;
int getuid(); //得到当前登录用户的用户ID;
int getuid(); //得到当前运行该进程的有效用户ID;
#include <pwd.h> //要导入的头文件
struct passwd* getpwuid(int userid); //取得用户的所有信息;
get pw uid
struct passwd* getpwnam(int useid); //根据用户名返回用户信息
get pwuid
如果不知道要到入哪个头文件. [man 函数] 就可以找到包含这个函数的头文件:
-----------------------------------------------------------------------------------
#include <iostream>
using namespace std;
int main(int argc,char* argv[],char* env[])
{
char name[100];
cout<<"input you name or id"<<endl;
char ch;
ch=cin.peek;
passwd* p=NULL;
if(ch>='0' && ch<='9'){
cin>>uid;
getpwuid(uid)
else{
cin>>name;
p=getpwnam(name);
}
if(p==NULL)
cout<<;
else
{
cout<<p->pw_name<<enld;
cout<<p->pw_uid<<enld;
cout<<p->pw_name<<enld;
}
}
--------------------------------------------------------------------------------
(2) 文件系统
1. 概述
/宏观: pwd 建,删除,设置一个目录,
目录
/微观: 看目录的内容:
绝对路径(absolute path)
相对路径(relative path)
--------------------------------------------------------------------------
2. 目录
#include <unistd.h>
char* getcwd(char* buf,size_t_size)'cwd'=courrent working directory
char* buf: //传一个字符数组名:(要把字符串放到指定的地方去)
size_t_size: // 这个字符串有多大.
1,先准备好空间;
2,告知大小(把大小传过去);
返回值 char*: 传什么过去,返回什么 (有返回值是为了方便使用)
cout<<getcwd(buf,100)<<enld;
xxxx_t : 表示整数类型 short long int;
pwd= print working directory
--------------------------------
例子:
#include <iostream>
using namespace std;
#include <unistd.h>
int main(int argc,char* argv[],char* env[])
{
char name(256); //必需先准备好地方;
getcwd(name,sizeof(name)); //取当前目录的绝对路径:
cout<<name<<endl;
cout<<getcwd(name,sizeof(name))<<endl; //直接就可以输出.
}
----------------------------------------------------------------------------------
新增知识:
printf("%d字符串%f%s") //把占位符写出来.
---------------------------------------------------------------------------------
有效用户,用户在执行这个程序的时候有编辑者同样的权限.
----------------------------------------------------------------------------
2. 对目录的操作.
int mkdir() //创建一个目录
int rmidr(); //删除一个目录
int chdir(); //更改当前工作
当前目录相对于环境变量;退出进程环境变量就失效.
----------
例子:
#include <iostream>
using namespace std;
#include <unistd.h>
#include <sys/stat.h>
//#include <sys/types.h> //可以导入也可以不导入这个头文件.
int main()
{
cout << "cmd:m name/r name/c name/g/q" << endl;
char cmd;
char name[256];
for(;
{
cin >> cmd;
switch( cmd )
{
case 'm':
cin >> name;
if(mkdir(name, 0755)<0)
cout << "Error!" << endl;
else
cout << "OK!" << endl;
break;
case 'r':
cin >> name;
if(rmdir(name)<0)
cout << "Error!" << endl;
else
cout << "OK!" << endl;
break;
case 'c':
cin >> name;
if(chdir(name)<0)
cout << "Error!" << endl;
else
cout << "OK!" << endl;
break;
case 'g':
getcwd(name, sizeof(name));
cout << name << endl;
break;
case 'q':
return 0;
default:
cout << "Invalid cmd!" << endl;
break;
}
}
return 0;
}
3.查看指定的目录项;
#include <sys/type.h>
#include <dirent.h> //dir entry(目录入口)
DIR* opendir(const char* dirname); //打开操作只有一次.
DIR 是一个数据类型. (未知类型 UFO )
struct dirent* readdir(); //每次读一个目录项;
//返回类型也是指针: struct dirent* 在C++ 中不要 struct关键字 根据指针是否是 NULL 来判断是否读完.
int closedir(DIR *dirp);
-----------------------------
例子:
#include <iostream>
using namespace std;
#include <dirent.h>
int main( int argc, char* argv[] )
{
if( argc==1 )
{
cout << *argv << " dir_name/n";
return 0;
}
DIR* pd=opendir(argv[1]);
if( pd==NULL )
{
cout << argv[1] << " not exist/n";
return 0;
}
dirent* p=NULL; // p里面有d_name 成员
while( (p=readdir(pd))!=NULL )
{
cout << p->d_name << endl;
}
closedir(pd);
return 0;
}
3.文件操作
UNIX 操作系统只提供少量接口例如: open() read() write() lseek()//调整读的位置
open()
文件名 和 文件描述符;
系统给文件一个文件ID(文件描述符) 非负整数.
- shell 三个标准描述符 (0,1,2) (cin,cout,cerr)
open() 函数:
int opne(const char* pathname,int oflag,..)
pathname;
int oflag:
<o_RDONLY|O_WRONLY+0_RDWR> //必需选一个,只能选一个
1.O_APPEND: 加到后面.
2.O_CREAT :如果没有则要创见这个目录.如果存在打开.
3.O_EXCL : 独占方式打开
4.O_TRUNC: 把原有内容清空.
把2和3合并, 用于令牌控制.只允许一个人能够成功.
只要执行2,就要指定权限.
Read/Write
//读到文件末尾,返回0;
size_t read(int fd,void* buf,size_t nbytes);
fd;
buf; 要放的位置.
size_t nbytes: 读的字节数.
size_t write(int fg,void* buf,size_t nbytes);
fg:
buf:
nbytes:
umask//用户权限屏蔽; 例如: 0022 屏蔽指定:066. rw_rw_rw_ 把w的权限. 077屏蔽: 屏蔽其他的所有权限.
umask() 也是函数;
#include <iostream>
using namespace std;
#include <unistd.h>
#include <fcntl.h>
int main( int argc, char* argv[] )
{
if( argc!=3 )
{
cout << *argv << " file newfile/n";
return 0;
}
umask(0); //把权限屏蔽关掉 默认的 是02 或者 022
int src=open(argv[1], O_RDONLY);
if( src<0 )
{
cout << "cannot access " << argv[1] << endl;
return 0;
}
int dst=open(argv[2], O_WRONLY|O_CREAT|O_EXCL, 0666);
if( dst<0 )
{
cout << "cannot access " << argv[2] << endl;
close(src);
return 0;
}
char buf[1024];
int len;
while( (len=read(src, buf, 1024))>0 )
write(dst, buf, len);
close(src);
close(dst);
return 0;
}
----------------------------------------------------------------------
bianry_read 和 bianry_wreate 没听
----------------------------------------------------------------------
Lseek function
off_t lseek(int fd,off_t offset,int whence)
fd : 读写的文件
offset : 跳多远
whence : 从哪儿跳 有三个参数
SEEK_SET: 正偏移
SEEK_CUR: 从当前位置.
SEEK_END; 负偏移.
//到指定位置读写学生信息.
--------------------------------------------
例子:
#include <iostream>
using namespace std;
#include <unistd.h>
#include <fcntl.h>
struct ST{
char name[20];
double score;
};
int main()
{
int fd=open("st.dat", O_RDWR|O_CREAT, 0600);
if( fd<0 )
{
cout << "cannot access st.dat/n";
return 0;
}
ST s;
for( int i=0; i<3; i++ )
{
cout << "input name and score:";
cin >> s.name >> s.score;
write(fd, &s, sizeof(s));
}
cout << "input student no(1~3):";
int no;
cin >> no;
lseek(fd, (no-1)*sizeof(ST), SEEK_SET);
read(fd, &s, sizeof(s));
cout << s.name << ',' << s.score << endl;
close(fd);
return 0;
}
---------------------------------------------------
/unlink(const char* path);
删除文件:
/remove(const char* path);
改名子: rename(oldname,newname);