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[]);

  

posted @ 2021-12-02 11:16  迷人的危险~  阅读(33)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css