C库函数描述
目录操作函数
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
struct dirent {
ino_t d_ino; // inode 编号
off_t d_off; // 到下一个目录项的偏移量
unsigned short d_reclen; // 目录项记录的长度
unsigned char d_type; // 文件类型;并非所有文件系统类型都支持该字段
char d_name[256]; // 文件名
};
打开目录
/*
* 功能:打开指定目录
* 参数:需要打开的目录路径
* 返回值
* 成功:下个目录进入点
* 错误或读取到目录文件尾:NULL
*/
DIR *opendir(const char *name);
读取目录
/*
* 功能:读取指定目录
* 参数:由opendir函数返回的目录指针
* 返回值:
* 成功:下个目录进入点
* 错误或读取到目录文件尾:NULL
*/
struct dirent *readdir(DIR *dirp);
创建目录
更改工作目录
#include <unistd.h>
/*
* 功能:更改进程的当前工作目录
* 参数: path目标目录,可以是绝对目录或相对目录
* 返回值:
* 成功0
* 失败-1
*/
int chdir(const char *path);
获取工作目录
/*
* 功能:获取进程的当前工作目录
* 参数:用于存储返回的目录路径, buf数组的大小
* 返回值:
* 成功: 返回当前工作目录
* 失败: 返回1
*/
char *getcwd(char *buf, size_t size);
关闭目录
/*
* 功能:关闭一个打开的目录
* 参数:由opendir函数返回的目录指针
* 返回值:
* 成功: 返回0
* 失败: 返回1
*/
int closedir(DIR *dirp);
代码示例
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
int main(void)
{
DIR * dir;
struct dirent * ptr;
int i;
dir = opendir("/etc/rc.d");
while((ptr = readdir(dir)) != NULL) {
printf("d_name : %s\n", ptr->d_name);
}
closedir(dir);
return 0;
}
获取文件信息
int fstat(int filedes, struct stat *buf); // (描述符,信息存储结构)
int stat(const char *path, struct stat *buf); // (文件路径,信息存储结构)
int lstat(const char *path, struct stat *buf);
返回值:成功则返回0,失败返回-1,错误代码存于errno。
struct stat {
mode_t st_mode; // 文件对应的模式,文件,目录等
ino_t st_ino; // inode节点号
dev_t st_dev; // 设备号
dev_t st_rdev; // 特殊设备号码
nlink_t st_nlink; // 文件的连接数
uid_t st_uid; // 文件所有者
gid_t st_gid; // 文件所有者对应的组
off_t st_size; // 普通文件,对应的文件字节数
time_t st_atime; // 文件最后被访问的时间
time_t st_mtime; // 文件内容最后被修改的时间
time_t st_ctime; // 文件状态改变时间
blksize_t st_blksize; // 文件内容对应的块大小
blkcnt_t st_blocks; // 伟建内容对应的块数量
};
system函数
/*
* 功能:在C程序中执行字符串指定的系统命令或程序
* 返回值:
* 1 命令为NULL
* -1 创建子进程失败
* 0x7f00 命令无法执行(子进程返回127)*
* 其他值 命令的返回值或退出码。
*
* 命令的返回值或退出码格式说明:
* Bits 15-8 进程返回值或退出码。
* Bit 7 是否产生了core dump。
* Bits 6-0 导致进程被杀死的信号值。
*
* 常用异常码解析宏:
* WIFEXITED(status) 正常退出返回非零值
* WEXITSTATUS(status) 取得返回值或退出码
*
* WIFSIGNALED(status) 被信号杀死返回非零
* WTERMSIG(status) 取得杀死它的信号值
*
* WIFSTOPPED(status) 被信号暂停返回非零
* WSTOPSIG(status) 取得暂停它的信号值
*/
int system(const char *cmdstring);
函数流程
|-cmd==NULL? --------------YES---->return 1
|-创建子进程--------------失败---->return -1
|-执行cmd-----------------失败---->return 0x7f00(32512)
|-等待cmd执行完毕--等待cmd失败---->return -1
|--------------------------------->return cmd返回值或退出码
system()返回值多而复杂,咋一看五花八门,所以必须妥善处理,下面是一个返回值处理的范本。
int main(int argc,const char **argv)
{
int ret=0;
const char *cmd=argv[1];
ret=system(cmd);
printf("system ret =%d\n",ret);
if(1==ret){
printf("程序命令为空\n");
}
else if(-1==ret){
printf("创建命令子进程失败\n");
}
else if(0x7f00==ret){
printf("命令错误,无法执行\n");
} else {
if(WIFEXITED(ret)){
printf("程序正常结束,返回值:%d\n",WEXITSTATUS(ret));
}
else if(WIFSIGNALED(ret)){
printf("程序被信号杀死,信号值:%d\n",WTERMSIG(ret));
}
else if(WSTOPSIG(ret)){
printf("程序被信号暂停,信号值:%d\n",WSTOPSIG(ret));
}
}
return 1;
}
https://zhuanlan.zhihu.com/p/457019360
#include <stdlib.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg , ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);