unxi shell是文件描述符0,1,2分别与标出输入,标准输出,标准错误相结合。
在POSIX.1应用程序中,在头文件<unistd.h>定义了STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO这3个常量来进行对应。
int open(const char *pathname,int oflag,....) ----出错为-1
open函数打开pathname指定的文件,并且返回最小的未用的描述符数字。例如可以先关闭标准输出,然后打开另外一个文件,这时这个文件的描述符=1.
int creat(const char *pathname,mode_t mode) ----出错为-1
此函数相当于open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode),它的不足之处在于是用只读的方式打开该文件。 如果创建一个文件,在里面写入内容,并且要读取出来,这时候必须要先关闭该文件,然后重新打开。
int close(int fid) -----成功返回0,否则-1
当关闭文件时也将释放该进程在该文件上的所有记录锁。当一个进程结束时,它所有打开的文件都会由内核自动关闭,所以也可以不显式调用close来关闭打开的文件。
off_t lseek(int fid,off_t offset,int whence) ---成功返回新的文件位移,出错则为-1
whence可以为以下3种情况:
SEEK_SET:将文件的位移量设置为开始处+offset
SEEK_CUR:将文件位移量设置为当前值+offset(offset可正可负)
SEEK_END:将文件位移量设置为文件长度+offset(offset可正可负),如果文件位移量大于文件长度并对其进行写操作,中间的空洞都会被读为0
ssize_t read(int fid,void * buff,size_t nbytes) ---成功返回读的字节数,若到末尾返回0,出错为-1
ssize_t write(int fid,const void * buff,size_t nbytes) ---成功返回已写字节数,出错为-1
原子操作:
当在一个程序中打开多个进程对同一文件进行操作(fork创建的子进程会复制父进程的进程表项)时,可能会造成共享冲突,这时候应该尽量使用原子操作的函数。
fctl函数的作用:
当文件描述符是被shell打开并以参数形式传递给程序时,我们不能使用open对其进行状态设置(不知道文件名),这个时候则可以使用fctl函数。