个人怎么做公司网站网站seo排名免费咨询
目录
- 1、stat、fstat、lstat、fstatat 函数
- 2、chmod、fchmod 函数
- 3、chown、fchown、lchown、fchownat函数
- 4、truncate、ftruncate函数
- 5、utime、utimes 函数
- 6、mkdir、rmdir函数
- 递归删除非空目录
- 7、opendir、fdopendir、readdir函数
- 8、chdir、fchdir、getcwd 函数
- 9、getpwnam、getpwuid 函数
- 10、getpwent、setpwent、endpwent函数
- 11、getspnam、getspent、setspent、endspent函数
- 12、crypt 函数
1、stat、fstat、lstat、fstatat 函数
头文件
#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>///* Definition of AT_* constants */#include <fcntl.h>
struct stat
结构体
struct stat {dev_t st_dev; // 文件所在设备的 IDino_t st_ino; // 文件的 inode 号mode_t st_mode; // 文件类型和权限nlink_t st_nlink; // 硬链接数uid_t st_uid; // 文件所有者的用户 IDgid_t st_gid; // 文件所有者的组 IDdev_t st_rdev; // 设备 ID(如果是特殊文件)off_t st_size; // 文件大小(字节数)blksize_t st_blksize; // 文件系统 I/O 块大小blkcnt_t st_blocks; // 分配的 512B 块数time_t st_atime; // 最后访问时间time_t st_mtime; // 最后修改时间time_t st_ctime; // 最后状态改变时间
};
函数定义
stat
函数
int stat(const char *pathname, struct stat *buf);
功能: 获取指定路径文件的状态信息。
参数:
- pathname: 文件的路径名。
- buf: 指向 struct stat 结构体的指针,用于存储文件的状态信息。
返回值:
- 成功时返回 0,失败时返回 -1 并设置 errno。
特点:
- 如果 pathname 是一个符号链接,则获取的是符号链接指向的文件的状态信息。
#include <sys/stat.h>
#include <stdio.h>int main() {struct stat buf;if (stat("example.txt", &buf) == 0) {printf("File size: %ld bytes\n", buf.st_size);} else {perror("stat");}return 0;
}
fstat
函数
int fstat(int fd, struct stat *buf);
功能: 获取与文件描述符 fd 相关联的文件的状态信息。
参数:
- fd: 文件描述符。
- buf: 指向 struct stat 结构体的指针,用于存储文件的状态信息。
返回值:
- 成功时返回 0,失败时返回 -1 并设置 errno。
特点:
- 适用于已经打开的文件。
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>int main() {int fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("open");return 1;}struct stat buf;if (fstat(fd, &buf) == 0) {printf("File size: %ld bytes\n", buf.st_size);} else {perror("fstat");}close(fd);return 0;
}
lstat
函数
int lstat(const char *pathname, struct stat *buf);
功能: 获取指定路径文件的状态信息。
参数:
- pathname: 文件的路径名。
- buf: 指向 struct stat 结构体的指针,用于存储文件的状态信息。
返回值:
- 成功时返回 0,失败时返回 -1 并设置 errno。
特点:
- 如果 pathname 是一个符号链接,则获取的是符号链接本身的状态信息,而不是它指向的文件。
#include <sys/stat.h>
#include <stdio.h>int main() {struct stat buf;if (lstat("symlink.txt", &buf) == 0) {printf("File size: %ld bytes\n", buf.st_size);} else {perror("lstat");}return 0;
}
fstatat
函数
int fstatat(int dirfd, const char *pathname, struct stat *buf,int flags);
功能: 获取相对于目录文件描述符 dirfd 的指定路径文件的状态信息。
参数:
- dirfd: 目录文件描述符,可以是 AT_FDCWD(表示当前工作目录)。
- pathname: 文件的路径名(相对于 dirfd)。
- buf: 指向 struct stat 结构体的指针,用于存储文件的状态信息。
- flags: 控制行为的标志,如 AT_SYMLINK_NOFOLLOW。
返回值:
- 成功时返回 0,失败时返回 -1 并设置 errno。
特点:
- 如果 flags 包含 AT_SYMLINK_NOFOLLOW,则不会跟随符号链接。 适用于相对路径操作。
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>int main() {struct stat buf;if (fstatat(AT_FDCWD, "example.txt", &buf, 0) == 0) {printf("File size: %ld bytes\n", buf.st_size);} else {perror("fstatat");}return 0;
}
总结
stat
: 获取文件状态,跟随符号链接。
fstat
: 获取已打开文件的状态。
lstat
: 获取文件状态,不跟随符号链接。
fstatat
: 获取相对于目录文件描述符的文件状态,支持标志控制行为。
2、chmod、fchmod 函数
头文件
#include <sys/stat.h>
函数定义
chmod
函数
int chmod(const char *pathname, mode_t mode);
功能: 修改指定路径文件的权限。
参数:
- pathname: 文件的路径名。
- mode: 新的权限模式,通常是一个八进制数(如 0644)或通过宏(如 S_IRUSR)组合。
返回值:
- 成功时返回 0,失败时返回 -1 并设置 errno。
特点:
- 修改的是文件路径对应的文件的权限。
- 如果 pathname 是一个符号链接,则修改的是符号链接指向的文件的权限。
示例
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>int main()
{
#if 0//直接修改文件权限if(chmod("hello.txt",0444) < 0){perror("chmod error");return -1;}printf("chomd success\n");
#endifstruct stat st = {0};stat("hello.txt",&st);if(!chmod("hello.txt",st.st_mode | 0200)){printf("chmod 0200 success\n");}else{printf("chmod 0200 error\n");}#if 0//if(!chmod("hello.txt",st.st_mode&0773))if(!chmod("hello.txt",st.st_mode^0004)){printf("chmod 004 success\0");}else{printf("chmod 0004 error\0");}
#endif}
fchmod
函数
int fchmod(int fd, mode_t mode);
功能: 修改与文件描述符 fd 相关联的文件的权限。
参数:
- fd: 文件描述符。
- mode: 新的权限模式。
返回值:
- 成功时返回 0,失败时返回 -1 并设置 errno。
特点:
- 修改的是已经打开的文件的权限。
- 适用于需要通过文件描述符操作文件的场景。
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>int main() {int fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("open");return 1;}if (fchmod(fd, 0644) == 0) {printf("File permissions changed successfully.\n");} else {perror("fchmod");}close(fd);return 0;
}
3、chown、fchown、lchown、fchownat函数
头文件
#include <fcntl.h> /* Definition of AT_* constants */#include <unistd.h>
函数定义
chown
函数
int chown(const char *pathname, uid_t owner, gid_t group);
功能: 更改指定路径文件或目录的所有者和/或所属组。
参数:
- pathname: 文件或目录的路径。
- owner: 新的用户ID(UID),如果为-1,则不更改所有者。
- group: 新的组ID(GID),如果为-1,则不更改所属组。
返回值: - 成功返回0,失败返回-1并设置errno。
#include <stdio.h>
#include <unistd.h>int main()
{if(chown("hello.txt",1000,1000) < 0)\{perror("chown error");return -1;}perror("chown success");
}
fchown
函数
int fchown(int fd, uid_t owner, gid_t group);
功能: 更改通过文件描述符指定的文件或目录的所有者和/或所属组。
参数:
- fd: 文件描述符。
- owner: 新的用户ID(UID),如果为-1,则不更改所有者。
- group: 新的组ID(GID),如果为-1,则不更改所属组。
返回值: - 成功返回0,失败返回-1并设置errno。
lchown
函数
int lchown(const char *pathname, uid_t owner, gid_t group);
功能: 类似于chown,但不跟随符号链接,即只更改符号链接本身的所有者和/或所属组,而不是链接指向的文件。
参数:
- pathname: 符号链接的路径。
- owner: 新的用户ID(UID),如果为-1,则不更改所有者。
- group: 新的组ID(GID),如果为-1,则不更改所属组。
返回值: - 成功返回0,失败返回-1并设置errno。
fchownat
函数
int fchownat(int dirfd, const char *pathname,uid_t owner, gid_t group, int flags);
功能: 类似于chown,但可以通过dirfd指定相对路径的基准目录,并且可以通过flags控制行为。
参数:
- dirfd: 基准目录的文件描述符,如果pathname是绝对路径,则忽略此参数。
- pathname: 文件或目录的路径。
- owner: 新的用户ID(UID),如果为-1,则不更改所有者。
- group: 新的组ID(GID),如果为-1,则不更改所属组。
- flags: 控制行为的标志,例如AT_SYMLINK_NOFOLLOW表示不跟随符号链接。
返回值:
- 成功返回0,失败返回-1并设置errno。
4、truncate、ftruncate函数
头文件
#include <unistd.h>#include <sys/types.h>
truncate
函数
int truncate(const char *path, off_t length);
功能:将指定路径的文件截断到指定长度,也可以扩容制造空洞文件
参数:
- path:文件的路径名。
- length:文件截断后的长度(以字节为单位)。
返回值:
- 成功时返回 0。失败时返回 -1
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{//截断if(truncate("hello.txt",5) < 0){perror("truncate error");return -1;}printf("truncate success\n");//扩充if(truncate("hello.txt",20) < 0){perror("truncate error");return -1;}printf("truncate success\n");
}
ftruncate
函数
int ftruncate(int fd, off_t length);
功能:将已打开的文件描述符对应的文件截断到指定长度,也可扩容制造空洞文件
参数:
- fd:文件描述符。
- length:文件截断后的长度(以字节为单位)。
返回值:
- 成功时返回 0。失败时返回 -1
5、utime、utimes 函数
头文件
#include <sys/types.h>#include <utime.h>#include <sys/time.h>
utime
函数
int utime(const char *filename, const struct utimbuf *times);
功能
修改指定文件的访问时间和修改时间。
参数
- filename:要修改时间的文件的路径名。
- times:指向 struct utimbuf 结构体的指针,包含新的访问时间和修改时间。如果为
NULL,则将文件的访问时间和修改时间设置为当前时间。
struct utimbuf
结构体
struct utimbuf {time_t actime; // 访问时间(Access Time)time_t modtime; // 修改时间(Modification Time)
};
返回值
- 成功时返回 0。
- 失败时返回 -1,并设置 errno。
#include <stdio.h>
#include <sys/types.h>
#include <utime.h>
#include <time.h>int main()
{struct tm time = {0};time.tm_year = 2025 - 1990;time.tm_mon = 3 -1;time.tm_mday = 3;time.tm_hour = 14;time.tm_min = 57;time.tm_sec = 0;time_t sec = mktime(&time); //获取对应时间的秒数struct utimbuf buf = {0};buf.actime = sec;buf.modtime = sec;if(utime("hello.txt",&buf) < 0){perror("utime error");return -1;}printf("utime success\n");return 0;
}
utimes
函数
int utimes(const char *filename, const struct timeval times[2]);
功能
修改指定文件的访问时间和修改时间,支持微秒级精度。
参数
- filename:要修改时间的文件的路径名。
- times:指向 struct timeval 数组的指针,包含新的访问时间和修改时间。如果为
NULL,则将文件的访问时间和修改时间设置为当前时间。
struct timeval
结构体
struct timeval {time_t tv_sec; // 秒数suseconds_t tv_usec; // 微秒数
};
返回值
- 成功时返回 0。
- 失败时返回 -1,并设置 errno。
#include <sys/time.h>
#include <stdio.h>int main() {struct timeval times[2];times[0].tv_sec = 1633072800; // 设置访问时间为 2021-10-01 00:00:00times[0].tv_usec = 0;times[1].tv_sec = 1633072800; // 设置修改时间为 2021-10-01 00:00:00times[1].tv_usec = 0;if (utimes("example.txt", times) == -1) {perror("utimes failed");return 1;}printf("File times updated successfully.\n");return 0;
}
6、mkdir、rmdir函数
头文件
//mkdir函数#include <sys/stat.h>#include <sys/types.h>//rmdir函数#include <unistd.h>
mkdir
函数
int mkdir(const char *pathname, mode_t mode);
功能
- 创建一个新目录
参数
- pathname:要创建的目录的路径名。
- mode:目录的权限模式,通常使用八进制表示(如 0755)。权限模式可以通过以下宏进行组合:
- S_IRWXU:用户(所有者)具有读、写、执行权限。
- S_IRUSR:用户具有读权限。
- S_IWUSR:用户具有写权限。
- S_IXUSR:用户具有执行权限。
- S_IRWXG:组用户具有读、写、执行权限。
- S_IRGRP:组用户具有读权限。
- S_IWGRP:组用户具有写权限。
- S_IXGRP:组用户具有执行权限。
- S_IRWXO:其他用户具有读、写、执行权限。
- S_IROTH:其他用户具有读权限。
- S_IWOTH:其他用户具有写权限。
- S_IXOTH:其他用户具有执行权限。
返回值
- 成功时返回 0。
- 失败时返回 -1,并设置 errno。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>int main()
{// 创建目录if(mkdir("dir",0777) < 0){perror("mkdir error");return -1;}printf("mkdir success\n");}
rmdir
函数
int rmdir(const char *pathname);
功能
- 删除一个空目录
参数
- pathname:要删除的目录的路径名。
返回值
- 成功时返回 0。
- 失败时返回 -1,并设置 errno。
递归删除非空目录
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>void remove_mydir(const char *pathname)
{DIR *dp = opendir(pathname);if (NULL == dp){perror("open dp error");return;}while (1){struct dirent *dirp = readdir(dp);if (dirp == NULL){break;}if (!(strcmp(dirp->d_name, ".")) || !(strcmp(dirp->d_name, "..")))continue;char buf[128] = "";strcat(buf, pathname);strcat(buf, "/");strcat(buf, dirp->d_name);struct stat st = {0};stat(buf, &st);if (S_ISREG(st.st_mode))unlink(buf);if (S_ISDIR(st.st_mode))remove_mydir(buf);}closedir(dp);remove(pathname);
}int main()
{remove_mydir("dir");return 0;
}
7、opendir、fdopendir、readdir函数
头文件
#include <sys/types.h>#include <dirent.h>
opendir
函数
DIR *opendir(const char *name);
功能: 打开一个目录,返回指向目录流的指针。
参数: name:要打开的目录的路径名。
返回值
- 成功时返回指向 DIR 结构的指针。
- 失败时返回 NULL,并设置 errno。
#include <dirent.h>
#include <stdio.h>int main() {const char *dir_path = "example_dir";DIR *dir = opendir(dir_path);if (!dir) {perror("opendir failed");return 1;}printf("Directory '%s' opened successfully.\n", dir_path);closedir(dir);return 0;
}
fdopendir
函数
DIR *fdopendir(int fd);
功能 :通过文件描述符打开目录,返回指向目录流的指针。
参数 :fd:已经打开的目录的文件描述符。
返回值
- 成功时返回指向 DIR 结构的指针。
- 失败时返回 NULL,并设置 errno。
#include <dirent.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>int main() {const char *dir_path = "example_dir";int fd = open(dir_path, O_RDONLY | O_DIRECTORY);if (fd == -1) {perror("open failed");return 1;}DIR *dir = fdopendir(fd);if (!dir) {perror("fdopendir failed");close(fd);return 1;}printf("Directory '%s' opened successfully via fd.\n", dir_path);closedir(dir); // 关闭目录流时会自动关闭文件描述符return 0;
}
readdir
函数
struct dirent *readdir(DIR *dirp);
功能 :从目录流中读取下一个目录项。
参数
- dirp:指向 DIR 结构的指针(由 opendir 或 fdopendir 返回)。
返回值
- 成功时返回指向 struct dirent 的指针。
- 到达目录末尾时返回 NULL。
- 失败时返回 NULL,并设置 errno。
struct dirent
结构
struct dirent {ino_t d_ino; // 文件的 inode 号off_t d_off; // 目录文件中的偏移量unsigned short d_reclen; // 记录长度unsigned char d_type; // 文件类型char d_name[256]; // 文件名
};
示例-循环读取目录下的文件名
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>int main()
{// 打开目录DIR *dp = opendir("dir");if (NULL == dp){perror("opendir error");return -1;}// 读取目录while (1){struct dirent *dirp = readdir(dp);if (NULL == dirp)break;printf("name = %s\n", dirp->d_name);}// 关闭目录closedir(dp);
}
8、chdir、fchdir、getcwd 函数
头文件
#include <unistd.h>
chdir
函数
int chdir(const char *path);
功能:将当前进程的工作目录更改为指定的路径。
参数:path:目标目录的路径名。
返回值
- 成功时返回 0。
- 失败时返回 -1,并设置 errno。
#include <unistd.h>
#include <stdio.h>int main() {const char *new_dir = "/tmp";if (chdir(new_dir) == -1) {perror("chdir failed");return 1;}printf("Changed working directory to '%s'.\n", new_dir);return 0;
}
fchdir
函数
int fchdir(int fd);
功能:通过文件描述符更改当前进程的工作目录。
参数:fd:已经打开的目录的文件描述符。
返回值
- 成功时返回 0。
- 失败时返回 -1,并设置 errno。
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>int main() {const char *new_dir = "/tmp";int fd = open(new_dir, O_RDONLY | O_DIRECTORY);if (fd == -1) {perror("open failed");return 1;}if (fchdir(fd) == -1) {perror("fchdir failed");close(fd);return 1;}printf("Changed working directory to '%s' via fd.\n", new_dir);close(fd);return 0;
}
getcwd
函数
char *getcwd(char *buf, size_t size);
功能:获取当前工作目录的绝对路径。
参数
- buf:存储路径的缓冲区。
- size:缓冲区的大小。
返回值
- 成功时返回指向 buf 的指针。
- 失败时返回 NULL,并设置 errno。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>int main()
{//获取当前工作目录char buf[128] = "";getcwd(buf,sizeof(buf)-1);printf("buf = %s\n",buf);//改变工作路径if(chdir("/home")<0){perror("chdir error");return -1;}memset(buf,0,sizeof(buf));getcwd(buf,sizeof(buf)-1);printf("buf = %s\n",buf);if(mkdir("lisi",0777)<0){perror("mkdir error");return -1;}
}
9、getpwnam、getpwuid 函数
头文件
#include <sys/types.h>#include <pwd.h>
struct passwd
结构体
#include <pwd.h>struct passwd {char *pw_name; // 用户名uid_t pw_uid; // 用户 IDgid_t pw_gid; // 组 IDchar *pw_dir; // 用户主目录char *pw_shell; // 用户默认 shell
};
getpwnam
函数
struct passwd *getpwnam(const char *name);
功能: 通过用户名查询用户信息。
参数 用户名(字符串)。
返回值
- 成功时返回指向 struct passwd 结构体的指针。
- 失败时返回 NULL,并设置 errno。
getpwuid
函数
struct passwd *getpwuid(uid_t uid);
功能:通过用户 ID 查询用户信息。
参数:uid:用户 ID。
返回值
- 成功时返回指向 struct passwd 结构体的指针。
- 失败时返回 NULL,并设置 errno。
#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>int main()
{// struct passwd *pwd = getpwnam("student");struct passwd *pwd = getpwuid(1000);if(NULL == pwd){perror("getpwname error");return -1;}printf("name = %s uid = %d home = %s\n",pwd->pw_name,pwd->pw_uid,pwd->pw_dir);
}
10、getpwent、setpwent、endpwent函数
头文件
#include <sys/types.h>#include <pwd.h>
函数定义
struct passwd *getpwent(void);void setpwent(void);void endpwent(void);
getpwent
函数
功能:从用户数据库(就是etc/passwd
中的用户信息)中逐条读取用户信息。
返回值
- 成功时返回指向 struct passwd 结构体的指针。
- 失败或到达文件末尾时返回 NULL,并设置 errno。
#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>int main()
{while (1){struct passwd *pwd = getpwent(); //读取用户信息if(pwd == NULL)break;printf("name = %s uid = %d home = %s\n",pwd->pw_name,pwd->pw_uid,pwd->pw_dir);}}
setpwent
函数
功能
将用户数据库的读取位置重置到文件开头,以便重新开始遍历。
endpwent
函数
功能
关闭用户数据库,释放相关资源。
#include <pwd.h>
#include <stdio.h>int main() {struct passwd *pwd;// 第一次遍历printf("First pass:\n");while ((pwd = getpwent()) != NULL) {printf("User: %s\n", pwd->pw_name);}setpwent(); // 重置读取位置// 第二次遍历printf("\nSecond pass:\n");while ((pwd = getpwent()) != NULL) {printf("User: %s\n", pwd->pw_name);}endpwent(); // 关闭用户数据库return 0;
}
11、getspnam、getspent、setspent、endspent函数
头文件
#include <shadow.h>
#include <shadow.h>struct spwd {char *sp_namp; // 用户名char *sp_pwdp; // 加密后的密码long sp_lstchg; // 上次密码更改的日期(从1970-01-01开始的天数)long sp_min; // 密码最短有效天数long sp_max; // 密码最长有效天数long sp_warn; // 密码过期前的警告天数long sp_inact; // 密码过期后账户被锁定的天数long sp_expire; // 账户过期的日期(从1970-01-01开始的天数)unsigned long sp_flag; // 保留字段
};
函数定义
struct spwd *getspnam(const char *name);struct spwd *getspent(void);void setspent(void);void endspent(void);
getspnam
函数
功能
根据用户名从影子密码文件中查找并返回相应用户的密码信息。
参数:name:要查找的用户名。
返回值
- 成功时返回指向 struct spwd 结构体的指针。
- 失败时返回 NULL,并设置 errno。
getspent
函数
功能
从影子密码文件中逐条读取用户密码信息。
返回值
- 成功时返回指向 struct spwd 结构体的指针。
- 失败或到达文件末尾时返回 NULL,并设置 errno。
#include <stdio.h>
#include <shadow.h>int main()
{
#if 1struct spwd *pwd = getspnam("student");if(NULL == pwd){perror("getspnam error");return -1;}printf("%s\n",pwd->sp_pwdp);
#endif// while(1)// {// struct spwd *pwd = getspent();// if(NULL == pwd)// break;// printf("%s %s\n",pwd->sp_namp,pwd->sp_pwdp);// }
}
setspent
函数
将影子密码文件的读取位置重置到文件开头,以便重新开始遍历。
endspent
函数
关闭影子密码文件并释放相关资源。
#include <shadow.h>
#include <stdio.h>int main() {struct spwd *spwd;// 第一次遍历printf("First pass:\n");while ((spwd = getspent()) != NULL) {printf("Username: %s\n", spwd->sp_namp);}setspent(); // 重置读取位置// 第二次遍历printf("\nSecond pass:\n");while ((spwd = getspent()) != NULL) {printf("Username: %s\n", spwd->sp_namp);}endspent(); // 关闭影子密码文件return 0;
}
12、crypt 函数
头文件
#include <unistd.h>
函数定义
char *crypt(const char *key, const char *salt);
参数
- key:需要加密的字符串(通常是用户密码)。
- salt:用于加密的“盐值”(salt),通常是一个长度为 2 的字符串。盐值用于确保相同的密码在使用不同的盐值时生成的加密结果不同。
返回值
- 成功时返回指向加密后字符串的指针。
- 失败时返回 NULL,并设置 errno。
#include <stdio.h>
#include <crypt.h>
#include <unistd.h>int main()
{char *key = "888"; //需要加密的密码char *res = crypt(key, "$6$ZqEnV1wT$");if (res != NULL){printf("res = %s\n", res);}else{perror("crypt error");return -1;}
}