文件的创建:
#include <sys/types.h>
#include <sys/stat.h>
#include<fcnt l.h>
int creat(const char *pathname ,mode_t mode)
#include <sys/types.h> 是一个预处理指令,用于在C程序中包含系统类型定义的头文件。这个头文件定义了多个基础数据类型,这些类型在编写系统级程序时非常重要。下面详细介绍这些类型及其用途:
数据类型定义
<sys/types.h>
主要定义了以下几种类型:
off_t:
定义: typedef long off_t; (在某些平台上可能是 typedef long long off_t;)
用途: 用于表示文件的偏移量(即相对于文件起始位置的字节数)。在进行文件操作时经常用到,如 lseek() 函数。
ssize_t:
定义: typedef long ssize_t; (在某些平台上可能是 typedef long long ssize_t;)
用途: 用于表示带符号的大小值,通常用于返回读写操作的结果,如 read() 和 write() 函数的返回值。
size_t:
定义: typedef unsigned long size_t; (在某些平台上可能是 typedef unsigned long long size_t;)
用途: 用于表示无符号的大小值,如数组长度或内存分配的大小。常用于 malloc() 和 sizeof()。
mode_t:
定义: typedef unsigned short mode_t; (在某些平台上可能是 typedef unsigned int mode_t;)
用途: 用于表示文件的状态和权限信息。常用于 open() 和 chmod() 等函数。
dev_t:
定义: typedef unsigned int dev_t; (在某些平台上可能是 typedef unsigned long dev_t;)
用途: 用于表示设备号。在文件系统的inode结构中用来标识设备。
ino_t:
定义: typedef unsigned int ino_t; (在某些平台上可能是 typedef unsigned long ino_t;)
用途: 用于表示inode号。每个文件在文件系统中的唯一标识符。
blksize_t:
定义: typedef long blksize_t; (在某些平台上可能是 typedef long long blksize_t;)
用途: 用于表示块大小。通常用于文件系统中的块大小定义。
clock_t:
定义: typedef long clock_t; (在某些平台上可能是 typedef long long clock_t;)
用途: 用于表示CPU时间。常用于计算函数的执行时间。
time_t:
定义: typedef long time_t; (在某些平台上可能是 typedef long long time_t;)
用途: 用于表示时间戳。常用于记录时间或计算时间间隔。
id_t:
定义: typedef unsigned int id_t; (在某些平台上可能是 typedef unsigned long id_t;)
用途: 用于表示身份标识符,如用户ID (uid_t) 和组ID (gid_t)。
实例:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main() {
// 打开一个文件
int fd = open("example.txt", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
if (fd == -1) {
perror("Error opening file");
return 1;
}
// 获取文件大小
struct stat sb;
if (fstat(fd, &sb) == -1) {
perror("Error getting file status");
close(fd);
return 1;
}
off_t fileSize = sb.st_size;
printf("File size is %ld bytes.\n", (long)fileSize);
// 关闭文件
if (close(fd) == -1) {
perror("Error closing file");
return 1;
}
return 0;
}
在这个示例中,我们使用了 <sys/types.h>
中定义的 off_t
类型来表示文件大小,并使用了 struct stat
来获取文件的状态信息。
总之,<sys/types.h>
是编写系统级程序时不可或缺的一个头文件,它定义了许多用于文件操作、时间处理等场景的基础数据类型。通过使用这些类型,可以编写更加健壮和可移植的程序。
<sys/stat.h>
头文件
在 <sys/stat.h>
头文件中定义的文件类型的常量是用来标识文件系统的对象类型。
以下是一些常见的文件类型常量及其含义:
S_IFREG
:普通文件。这是最常见的文件类型,不具有特殊的用途。S_IFDIR
:目录文件。用于存储文件和其他目录的集合。S_IFCHR
:字符设备文件。这类文件代表了一个硬件设备,如键盘或鼠标,它们通常位于/dev
目录下。S_IFBLK
:块设备文件。这类文件也代表了一个硬件设备,但是它们通常是用于存储设备,如硬盘或CD-ROM驱动器。S_IFIFO
或S_IFnamedpipe
:命名管道文件。这是一种用于进程间通信的机制,允许一个进程向另一个进程发送数据。S_IFLNK
:符号链接文件。这是一种特殊的文件,它实际上是指向另一个文件或目录的链接。S_IFSOCK
:套接字文件。这是一种用于进程间通信的抽象对象,主要用于网络通信。
在 <sys/stat.h>
中定义的主要结构体是 struct stat
,它包含了描述文件状态的各种信息。下面是一个 struct stat
的简化版本
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* Inode number */
mode_t st_mode; /* Type of file and file mode bits */
nlink_t st_nlink; /* Number of hard links */
uid_t st_uid; /* User ID of owner */
gid_t st_gid; /* Group ID of owner */
dev_t st_rdev; /* Device ID (if special file) */
off_t st_size; /* Total size, in bytes */
blksize_t st_blksize; /* Block size for filesystem I/O */
blkcnt_t st_blocks; /* Number of 512B blocks allocated */
time_t st_atime; /* Time of last access */
time_t st_mtime; /* Time of last modification */
time_t st_ctime; /* Time of last status change */
};
st_dev: 文件所在设备的标识符。
st_ino: 文件的inode编号。
st_mode: 文件的类型和权限模式。
st_nlink: 文件的硬链接数。
st_uid: 文件拥有者的用户ID。
st_gid: 文件拥有者的组ID。
st_rdev: 如果文件是一个特殊文件(如设备文件),则为设备号。
st_size: 文件的大小(以字节为单位)。
st_blksize: 文件系统I/O使用的块大小。
st_blocks: 为文件分配的512字节块的数量。
st_atime: 上次访问的时间。
st_mtime: 上次修改的时间。
st_ctime: 上次状态改变的时间。
包含的常见函数及其功能:
stat()
函数
stat()
函数用来获取文件的状态信息,并将其存入一个 struct stat
结构中。如果文件不存在或者有其他错误发生,则返回 -1。
lstat()
函数
lstat()
函数类似于 stat()
,但是它不会递归地解析符号链接,而是直接返回符号链接本身的信息。
fstat()
函数
fstat()
函数通过文件描述符来获取文件的状态信息。
chmod()
函数
chmod()
函数用于改变文件或目录的权限。
access()
函数
access()
函数用于测试文件的可访问性。
<fcnt l.h>头文件:
<fcntl.h> 包含了一系列函数和宏定义,用于处理文件描述符相关的任务。以下是一些主要的功能:
文件描述符控制操作 (fcntl)
文件锁定 (flock)
文件锁记录操作 (flockfile, funlockfile, open_file_stream)
文件描述符标志 (O_* 宏定义)
常见函数及其参数:
fcntl()
函数
fcntl()
函数用于执行各种文件描述符控制操作,例如设置文件描述符标志、获取当前标志等。
fd
: 文件描述符。cmd
: 指定要执行的操作。arg
: 可选参数,取决于具体的命令。
常用命令:
F_GETFL
: 获取文件描述符的当前标志。F_SETFL
: 设置文件描述符的标志。F_GETLK
,F_GETLKW
: 获取文件上的锁。F_SETLK
,F_SETLKW
: 设置文件上的锁。
flock() 函数:
flock() 函数用于在文件描述符上执行文件锁操作。
参数:
fd
: 文件描述符。operation
: 锁定操作,例如LOCK_EX
(独占锁)、LOCK_SH
(共享锁)等。
文件描述符标志 (O_*
):
文件描述符标志用于控制文件描述符的行为,例如是否支持非阻塞模式、是否继承给子进程等。
常用标志:
O_RDONLY
: 以只读方式打开文件。O_WRONLY
: 以只写方式打开文件。O_RDWR
: 以读写方式打开文件。O_CREAT
: 如果文件不存在,则创建文件。O_TRUNC
: 如果文件存在并且以写方式打开,则截断文件到长度为零。O_APPEND
: 每次写入时追加到文件末尾。O_NONBLOCK
: 打开文件时设置非阻塞标志。
<unistd.h>头文件:
<unistd.h>它定义了许多与文件和进程相关的标准系统调用。这些函数允许程序执行诸如读写文件、创建子进程、获取工作目录。
包含常见函数及其功能:
close()
-关闭一个已打开的文件描述符。
creat()
- 创建一个新的文件,并且设置其初始模式。
dup()和dup2()
- 复制一个文件描述符。
exec() 家族
- 替换当前进程的映像。
fork()
- 创建一个新的进程。
getcwd()
- 获取当前工作目录。
link() 和 symlink()
- 创建硬链接或符号链接。
mkdir()
- 创建目录。
open()
- 打开或创建一个文件。
pipe()
- 创建管道。
read()
- 从文件描述符读取数据。
unlink() 和 remove()
- 删除一个文件。
wait() 和 waitpid()
- 等待子进程终止。
write()
- 向文件描述符写入数据。