8.dup, dup2, fcntl,ioctl 系统调用
1)dup和dup2 函数原型:
#include<unistd.h>
int dup(int oldfd);
int dup2(int oldfd , int newfd);
dup用来赋值参数oldfd所指项的文件描述符。当复制成功时,返回最小的尚未被使用的文件描述符。出错返回-1
返回新的文件描述富和参数oldfd指向同一个文件,共享所有锁定,读写指针和各项权限和标志位。就是说当利用了lseek()对某个文件描述符操作时,另一个文件描述符的读写位置也会随着改变。
dup 与 dup2 的区别dup2 可以用参数newfd 指定新文件描述符的数值,若newfd已经被程序所使用,系统就将其关闭以释放改文件描述符;若oldfd与newfd相等,则dup2 返回newfd,而不关闭它。dup2调用成功返回新的描述符,出错返回-1。
2)fcntl函数(功能强大)
系统调用可以用来对以开的文件描述符进行各种操作以改变以打开的文件的各种属性。原型:
#include<unistd.h>
#include<fcntl.h>
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd , long arg);
int fcntl(int fd , int cmd , struct flock * lock);
fcntl的功能依据cmd值的不同而不同,
(1)F_DUPFD 功能与dup一样,可以赋值fd所指向的文件描述符,调用成功返回新的描述符,失败返回-1
(2)F_GETFD 用来获取文件描述符的close-on-exec标志。调用成功返回标志值,若此值的最后一位是0,则该标志没有设置,即意味着执行exec相关函数后文件描述符依然保持打开,否则在执行exec相关函数时将关闭文件描述符。失败返回-1。(并不是很懂)
(3) F_SETFD fcntl函数用来设置文件描述符的close-on-exec标志为第三个参数arg的最后一位,成功返回0,失败返回-1(也不是很懂)
(4)F_GETFL 用来获取文件的打开方式。成功返回标志值,失败返回-1.标志值含义同open系统调用一样
(5)F_SETFL 用来设置文件打开的方式为第三个参数arg制定的方式。但是linux系统智能设置O_APPEND,O_NONBLOCK(阻塞)O_ASYNC(异步)标志,他们的含义也和open一样。
。。。。
ioctl: 用来控制特殊设备文件的属性,第一个参数fd必须是一个已经打开的文件描述符,第三个参数一般为char * argp,它随着第二个参数request的不同而不同。参数request决定了参数argp是向ioctl传递数据还是从ioctl获取数据。、
9.文件属性操作
1.获取文件属性
stat/fstat/lstat()
#include<sys/types.h>
#include<sys/stat.h>
int stat(const char * file_name , struct stat * buf); 返回符号连接指向的文件状态信息
int fstat(int filedes , struct stat *buf);
int lstat(const char * file_name , struct stat * buf); 返回符号连接本身状态
成功返回0,失败返回-1;参数struct stat * buf 是一个保存文件状态信息的结构体
2.设置文件属性
chown/fchown/lchown() 用于修改文件的用户id和组id,
#include<sys/types.h>
#include<unistd.h>
int chown(const char * path , userid , gruouid);
int fchown(int fd,uid_t owner , gid_t group);
int ichown(const char * path , uid_t owner , gid_t group);
chown会将参数path所指定的文件所有者id更变为参数owner代表的用户id
3.truncate/ftruncate()
用于改变文件的大小,原型:
#include<unistd.h>
#include<sys/types.h>
int truncate(const char * path , off_t length);
int ftruncate(int fd, off_t length); //路径 , 长度 fd打开方式必须可写!!!
如果原来的文件大小比参数length大,则超过部分会被删除,如果原来的文件大小比参数length小,则文件被扩展,文件扩展的部分将以0填充。与sleek调用类似。 成功返回0,失败返回-1.
4.utime()
用与改变任何文件的st_mtime域 和 st_ctime 域 ,即存取时间和修改时间。
#include<sys/types.h>
#include<utime.h>
int utime(const char * filename, struct utimbuf * buf);
#include<sys/time.h>
int utimes(char * filename, struct timeval * tvp);
struct utimebuf
{
time_t actime; time_t modetime;
};
系统调用会把第一个参数filename指定的文件的存取时间改为第二个参数buf的actime,把修改时间改为第二个参数buf的modtime,如果buf是一个空指针,则将存取时间和就该时间都改为当前时间。成功0,错误-1
5.umask()用于是指文件创建时使用的屏蔽字,并返回以前的值;
#include<sys/types.h>
#include<sys/stat.h>
mode_t umask(mode_t mask);
三.文件的移动和删除
1.int rename(char * old path , char * new path) ;
2.int unlink(char * pathname);
int remove(char * pathname);
四.目录的创建和删除
1. int mkdir(char * pathname, mode);
2. int rmdir(char * pathname);
五.获取当前目录
char * getcwd (char * buf , size);
char * get_current_dir_name(void);
char * getwd(char * buf);
六.设置工作目录
int chdir(char * path);
int fchdir(int fd);
七.获取目录信息
1.DIR * opendir(char * name);
2.struct dirent readdir(DIR * dir);
struct dirent定义如下
{
long d_ino //目录i节点编号;
off_t d_off;//指目录文件开头至此目录进入点的位移,
unsigned short d_reclen //d_name 长度;
char d_name //文件名
}
3.closedir(DIR * dir)