好奇的探索者,理性的思考者,踏实的行动者。
Table of Contents:
Linux系统上的文件部分类型说明
* 普通文件。
就是储存到磁盘上大家所操作的各种数据文件;
* 管道文件。
是一个从一端发送数据,从另一端接收数据的通道;
* 目录
也叫目录文件,是包含了保存在目录中文件的列表;
* 设备文件
是一种特殊文件,提供了大多数物理设备的接口;
* 符号链接
包含了到另一个人文件的连接,类似于windows的快捷方式;
* 套接口
套接口更像管道文件,但可以让处于不同机器上的进程通讯。
文件描述符是个很小的正整数,它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。
例如:每个进程启动时都打开3个文件:
标准输入文件(stdin 0)
标准输出(stdout 1)
标准出错(stderr 2)
编程中应该使用<unistd.h>
中定义的STDIN_FILENO、 STDOUT_FILENO、 STDERR_FILENO代替数字0、1、2。
int open(const char *pathname, int flags); int close(int fd);
Open失败后会返回-1,并设置errno变量。
在一个文件描述符用完后一定要用close()函数关闭它,这样才能保证该进程对文件所有加的锁全部被释放
ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, void *buf, size_t count);
read例子:
int main()
{"abc.txt";
char s[] =
int fd = open(s, O_RDONLY);1)
if (fd == -
{"error is %s\n", strerror(errno));
printf(
}
else
{"success fd=%d\n", fd);
printf(100];
char buf[0, sizeof(buf));
memset(buf, 0)
while (read(fd, buf, sizeof(buf)) >
{"%s", buf);
printf(0, sizeof(buf));
memset(buf,
}
close(fd);
}0;
return }
write例子:
int main()
{"abc.txt";
char s[] =
int fd = open(s, O_RDWR | O_APPEND);1)
if (fd == -
{"error is %s\n", strerror(errno));
printf(
}
else
{"success fd=%d\n", fd);
printf(100];
char buf[0, sizeof(buf));
memset(buf, ");
strcpy(buf, “hello world\n
int i = write(fd, buf, strlen(buf));
close(fd);
}0; return
int fstat(int fd, struct stat *buf) int stat(const char *path, struct stat *buf);
Struct stat定义如下:
struct stat {/* ID of device containing file */
dev_t st_dev; /* inode number */
ino_t st_ino; /* protection */
mode_t st_mode; /* number of hard links */
nlink_t st_nlink; /* user ID of owner */
uid_t st_uid; /* group ID of owner */
gid_t st_gid; /* device ID (if special file) */
dev_t st_rdev; /* total size, in bytes */
off_t st_size; /* blocksize for filesystem I/O */
blksize_t st_blksize; /* number of blocks allocated */
blkcnt_t st_blocks; /* time of last access */
time_t st_atime; /* time of last modification */
time_t st_mtime; /* time of last status change */
time_t st_ctime; };
为了正确解释文件类型,有一套宏能够计算stat接口的st_mod成员。
/*
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
*/
定义和来源:
- 库函数:库函数是由C标准库或其他库提供的函数,可以在程序中调用。C标准库提供了许多常用的库函数,如printf
、scanf
、malloc
等。其他库(例如数学库、字符串处理库等)也可以提供自定义的库函数。
- 系统函数:系统函数是由操作系统提供的函数,用于访问操作系统的功能和服务。这些函数提供了操作系统级别的操作,如文件操作、进程管理、网络通信等。
跨平台性:
- 库函数:C标准库函数通常是跨平台的,也就是说,它们在不同的操作系统和编译器上都有相同的接口和功能。
- 系统函数:系统函数的接口和功能可能因操作系统的不同而有所变化。因此,在跨平台开发时,需要注意系统函数的兼容性和可移植性。
功能范围:
- 库函数:库函数提供了通用的功能,例如输入输出、字符串处理、数学运算等。这些函数是C语言提供的基本工具,可以在不同的应用中使用。
- 系统函数:系统函数提供了访问操作系统底层功能的接口,例如文件读写、进程管理、网络通信等。这些函数涉及到操作系统的内核级别操作,通常用于实现更高级别的功能。
* 库函数对系统函数进行了适当的封装,I/O操作进行缓冲,减少了系统调用开销
FILE *p fopen(const char *path, const char *mode);
int fclose(FILE *stream);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
int fprintf(FILE *stream, const char *fromat,…);
int fscanf(FILE *stream, const char *fromat,…);
char fgets(char *s, int size, FILE *stream);
int fputs(const char *s, FILE *stream);//文件目录
int remove(const char *pathname);
int rename(const char *oldpath, const char *newpath);//获取当前工作路径
char *getcwd(char *buf,size_t size);
DIR *opendir(const char *pathname);
struct dirent *readdir(DIR *dir); int closedir(DIR *dir);
程序中记录日志的功能:
void writelog(const char *log)
{
time_t tDate;
struct tm *eventTime;
time(&tDate);
eventTime = localtime(&tDate);1900;
int iYear = eventTime->tm_year + 1;
int iMon = eventTime->tm_mon +
int iDay = eventTime->tm_mday;
int iHour = eventTime->tm_hour;
int iMin = eventTime->tm_min;
int iSec = eventTime->tm_sec;16];
char sDate["%04d-%02d-%02d", iYear, iMon, iDay);
sprintf(sDate, 16];
char sTime["%02d:%02d:%02d", iHour, iMin, iSec);
sprintf(sTime, 1024];
char s["%s %s %s\n", sDate, sTime, log);
sprintf(s, "my.log", "a+");
FILE *fd = fopen(
fputs(s, fd);
fclose(fd); }
获取目录列表例子:
int main(int argc, char *argv[])
{2)
if (argc < 0;
return
DIR *dp;
struct dirent *dirp;1]);
dp = opendir(argv[
if (dp == NULL)
{"error is %s\n", strerror(errno));
printf(0;
return
}
while((dirp = readdir(dp)) != NULL)
{"%s\n", dirp->d_name);
printf(
}
closedir(dp);0;
return }