> Author: CurryCoder
> Mail: 1217096231@qq.com
> Created Time: 2020年07月04日 星期六 21时08分31秒
************************************************************************/
#include
#include
#include
#include
#include
int main(int argc, const char* argv[]){
// 打开一个文件hello
int fd = open("hello", O_RDWR | O_CREAT, 0777);
if(fd == -1){
printf("打开失败\n");
}
close(fd);
return 0;
}
read函数原型:
write函数原型:
/************************************************************************
> File Name: read_write.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月04日 星期六 21时34分47秒
************************************************************************/
#include
#include
#include
#include
#include
#include
#include
int main(int argc,const char* argv[]){
// 打开文件
int fd = open("english.txt",O_RDWR);
printf("fd = %d\n",fd);
// 打开另一个文件,写操作
int fd1 = open("temp", O_WRONLY | O_CREAT, 0664);
printf("fd1 = %d\n", fd1);
// read
char buf[4096];
int len = read(fd, buf, sizeof(buf));
while(len > 0){
// 数据写入文件中
int ret = write(fd1, buf, len);
printf("ret = %d\n", ret);
// read
len = read(fd, buf, sizeof(buf));
}
close(fd);
close(fd1);
return 0;
}
/************************************************************************
> File Name: lessk.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 10时40分22秒
************************************************************************/
#include
#include
#include
#include
#include
#include
#include
int main(int argc, const char* argv[]){
int fd = open("english.txt", O_RDWR);
if(fd == -1){
perror("open error");
exit(1);
}
// 文件拓展
int len = lseek(fd, 1000, SEEK_END);
write(fd, "a", 1);
printf("len=%d\n", len);
close(fd);
return 0;
}
/************************************************************************
> File Name: read_write.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月04日 星期六 21时34分47秒
************************************************************************/
#include
#include
#include
#include
#include
#include
#include
int main(int argc,const char* argv[]){
// 打开文件
int fd = open("english",O_RDWR);
printf("fd = %d\n",fd);
if(fd == -1){
perror("open error");
}
// 打开另一个文件,写操作
int fd1 = open("temp", O_WRONLY | O_CREAT, 0664);
printf("fd1 = %d\n", fd1);
// read
char buf[4096];
int len = read(fd, buf, sizeof(buf));
while(len > 0){
// 数据写入文件中
int ret = write(fd1, buf, len);
printf("ret = %d\n", ret);
// read
len = read(fd, buf, sizeof(buf));
}
close(fd);
close(fd1);
return 0;
}
/************************************************************************
> File Name: block_read.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 10时56分01秒
************************************************************************/
#include
#include
#include
// 阻塞读终端
int main(void){
char buf[10];
int n;
n = read(STDIN_FILENO, buf,10);
if(n < 0){
perror("read STDIN_FIFLENO");
exit(1);
}
write(STDOUT_FILENO, buf, n);
return 0;
}
/************************************************************************
> File Name: unblock_read.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 11时15分32秒
************************************************************************/
#include
#include
#include
#include
#include
#include
#define MSG_TRY "try again\n"
// 非阻塞读终端
int main(void){
char buf[10];
int fd, n;
// /dev/tty---->当前打开的终端设备
fd = open("/dev/tty", O_RDONLY | O_NONBLOCK);
if(fd < 0){
perror("open /dev/tty");
exit(1);
}
tryagain:
n = read(fd, buf,10);
if(n < 0){
// 如果write为非阻塞,但是没有数据可读,此时全局变量errno被设置为EAGAIN
if(errno == EAGAIN){
sleep(3);
write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));
goto tryagain;
}
perror("read /dev/tty");
exit(1);
}
write(STDOUT_FILENO, buf, n);
close(fd);
return 0;
}
struct stat {
dev_t st_dev; // 文件的设备编号
ino_t st_ino; // 节点
mode_t st_mode; // 重点:文件的类型和存取的权限
nlink_t st_nlink; // 连接到该文件的硬链接数目,刚建立的文件值为1
uid_t st_uid; // 重点:用户ID
gid_t st_gid; // 重点:用户组ID
dev_t st_rdev; // 设备类型,若此文件为设备文件,则为其设备编号
off_t st_size; // 重点:文件字节数(文件大小)
blksize_t st_blksize; // 块大小(文件系统的I/O缓冲区大小)
blkcnt_t st_blocks; // 块数
struct timespec st_atim; // 最后一次访问时间
struct timespec st_mtim; // 重点:最后一次修改时间
struct timespec st_ctim; // 最后一次改变时间(指属性)
};
/************************************************************************
> File Name: stat.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 11时48分58秒
************************************************************************/
#include
#include
#include
#include
#include
#include
int main(int argc, const char* argv[]){
struct stat st;
int ret = stat("english.txt",&st);
if(ret == -1){
perror("stat error");
exit(1);
}
printf("file size=%ld\n", st.st_size);
return 0;
}
/************************************************************************
> File Name: stat.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 11时48分58秒
************************************************************************/
#include
#include
#include
#include
#include
#include
int main(int argc, const char* argv[]){
struct stat st;
int ret = stat("english.txt",&st);
if(ret == -1){
perror("stat error");
exit(1);
}
printf("file size=%ld\n", st.st_size);
// 文件类型--判断是否为普通文件
if((st.st_mode & S_IFMT) == S_IFREG){
printf("这个文件是一个普通文件\n");
}
// 文件所有者操作权限
if(st.st_mode & S_IRUSR){
printf(" r\n");
}
if(st.st_mode & S_IWUSR){
printf(" w\n");
}
if(st.st_mode & S_IXUSR){
printf(" x\n");
}
return 0;
}
struct stat {
dev_t st_dev; // 文件的设备编号
ino_t st_ino; // 节点
mode_t st_mode; // 重点:文件的类型和存取的权限
nlink_t st_nlink; // 连接到该文件的硬链接数目,刚建立的文件值为1
uid_t st_uid; // 重点:用户ID
gid_t st_gid; // 重点:用户组ID
dev_t st_rdev; // 设备类型,若此文件为设备文件,则为其设备编号
off_t st_size; // 重点:文件字节数(文件大小)
blksize_t st_blksize; // 块大小(文件系统的I/O缓冲区大小)
blkcnt_t st_blocks; // 块数
struct timespec st_atim; // 最后一次访问时间
struct timespec st_mtim; // 重点:最后一次修改时间
struct timespec st_ctim; // 最后一次改变时间(指属性)
};
/************************************************************************
> File Name: stat.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 11时48分58秒
************************************************************************/
#include
#include
#include
#include
#include
#include
int main(int argc, const char* argv[]){
struct stat st;
int ret = lstat("s.s",&st);
if(ret == -1){
perror("stat error");
exit(1);
}
printf("file size=%ld\n", st.st_size);
// 文件类型--判断是否为普通文件
if((st.st_mode & S_IFMT) == S_IFREG){
printf("这个文件是一个普通文件\n");
}
// 文件所有者操作权限
if(st.st_mode & S_IRUSR){
printf(" r");
}
if(st.st_mode & S_IWUSR){
printf(" w");
}
if(st.st_mode & S_IXUSR){
printf(" x");
}
printf("\n");
return 0;
}
/************************************************************************
> File Name: access.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 15时40分48秒
************************************************************************/
#include
#include
#include
int main(int argc, const char* argv[]){
if(argc < 2){
printf("a.out filename\n");
exit(1);
}
int ret = access(argv[1],W_OK );
if(ret == -1){
perror("access");
exit(1);
}
printf("you can write this file.\n");
return 0;
}
chmod()修改文件权限
chown()修改文件所有者和所属组
/************************************************************************
> File Name: chmod.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 15时50分54秒
************************************************************************/
#include
#include
#include
#include
int main(int argc, const char* argv[]){
if(argc < 3){
printf("a.out filename mode\n");
exit(1);
}
int mode = strtol(argv[2], NULL, 8);
int ret = chmod(argv[1], mode);
if(ret == -1){
perror("chmod");
exit(1);
}
ret = chown(argv[1], 1001, 1002);
if(ret == -1){
perror("chown");
exit(1);
}
return 0;
}
/************************************************************************
> File Name: chdir.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 16时07分20秒
************************************************************************/
#include
#include
#include
#include
#include
#include
int main(int argc, const char* argv[]){
if(argc < 2){
printf("a.out dir\n");
exit(1);
}
int ret = chdir(argv[1]);
if(ret == -1){
perror("chdir");
exit(1);
}
int fd = open("chdir.txt", O_CREAT | O_RDWR, 0777);
if(fd == -1){
perror("open");
exit(1);
}
close(fd);
char buf[128];
getcwd(buf, sizeof(buf));
printf("current dir: %s\n", buf);
return 0;
}
(1).打开一个目录opendir()
(2).读目录
struct dirent {
ino_t d_ino; // 此目录进入点的inode
ff_t d_off; // 目录文件开头至此目录进入点的位移
signed short ind d_reclen; // d_name的长度,不包含NULL字符
unsigned char d_type; // 重点:d_name所指的文件类型
har d_name[256]; // 重点:文件名
};
d_type:
struct dirent* readdir(DIR* dirp);
(3).关闭目录
/************************************************************************
> File Name: getfilenumber.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 21时24分32秒
************************************************************************/
#include
#include
#include
#include
#include
#include
#include
// 读指定目录中的文件个数
int get_file_num(const char* root){
int total = 0;
// 读目录
DIR* dir = NULL;
dir = opendir(root);
if(dir == NULL){
perror("opendir error");
exit(1);
}
// 循环读目录中的文件
struct dirent* ptr = NULL;
while((ptr = readdir(dir)) != NULL){
// 不处理.和..目录
if(strcmp(".", ptr->d_name) == 0 || strcmp("..", ptr->d_name) == 0){
continue;
}
// 判断是否是普通文件
if(ptr->d_type == DT_REG){
total++;
}
// 如果是目录,则需要递归
if(ptr->d_type == DT_DIR){
// 求出子目录
char path[1024] = {0};
sprintf(path, "%s/%s", root, ptr->d_name);
total += get_file_num(path);
}
}
// 关闭目录
closedir(dir);
return total;
}
int main(int argc, const char* argv[]){
if(argc < 2){
printf("./a.out path\n");
exit(1);
}
int total = get_file_num(argv[1]);
printf("%s目录下的普通文件共有:%d个\n", argv[1],total);
return 0;
}
复制文件描述符
改变已经打开的文件的属性:fcntl
/************************************************************************
> File Name: dup.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 22时07分30秒
************************************************************************/
#include
#include
#include
#include
#include
#include
#include
int main(void){
int fd = open("tmp", O_RDWR | O_CREAT, 0664);
if(fd == -1){
perror("open");
exit(1);
}
// 复制文件描述符
int fd2 = dup(fd);
// int fd2 = fcntl(fd, F_DUPFD);
// 写文件
char* p = "代码改变世界...";
write(fd2, p, strlen(p));
close(fd2);
char buf[1024];
lseek(fd, 0, SEEK_SET);
read(fd, buf, sizeof(buf));
printf("buf = %s\n", buf);
close(fd);
return 0;
}
/************************************************************************
> File Name: dup2.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 22时07分30秒
************************************************************************/
#include
#include
#include
#include
#include
#include
#include
int main(void){
int fd = open("tmp", O_RDWR | O_CREAT | O_APPEND, 0664);
if(fd == -1){
perror("open");
exit(1);
}
int fd2 = open("tmp1", O_RDWR | O_CREAT | O_APPEND, 0664);
if(fd2 == -1){
perror("open open");
exit(1);
}
// 复制文件描述符
dup2(fd, fd2);
// 写文件
char* p = "code change the world...";
write(fd2, p, strlen(p));
close(fd2);
char buf[1024];
lseek(fd, 0, SEEK_SET);
read(fd, buf, sizeof(buf));
printf("buf = %s\n", buf);
close(fd);
return 0;
}
/************************************************************************
> File Name: fcntl.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 22时28分26秒
************************************************************************/
#include
#include
#include
#include
#include
int main(void)
{
int fd;
int flag;
// 测试字符串
char *p = "我们是一个有中国特色的社会主义国家!!!!!!";
char *q = "呵呵, 社会主义好哇。。。。。。";
// 只写的方式打开文件
fd = open("test.txt", O_WRONLY);
if(fd == -1)
{
perror("open");
exit(1);
}
// 输入新的内容,该部分会覆盖原来旧的内容
if(write(fd, p, strlen(p)) == -1)
{
perror("write");
exit(1);
}
// 使用 F_GETFL 命令得到文件状态标志
flag = fcntl(fd, F_GETFL, 0);
if(flag == -1)
{
perror("fcntl");
exit(1);
}
// 将文件状态标志添加 ”追加写“ 选项
flag |= O_APPEND;
// 将文件状态修改为追加写
if(fcntl(fd, F_SETFL, flag) == -1)
{
perror("fcntl -- append write");
exit(1);
}
// 再次输入新内容,该内容会追加到旧内容的后面
if(write(fd, q, strlen(q)) == -1)
{
perror("write again");
exit(1);
}
// 关闭文件
close(fd);
return 0;
}
/************************************************************************
> File Name: fc.c
> Author: CurryCoder
> Mail: [email protected]
> Created Time: 2020年07月05日 星期日 22时30分16秒
************************************************************************/
#include
#include
#include
#include
#include
int main(void)
{
int fd;
int flag;
// 测试字符串
char *p = "我们是一个有中国特色的社会主义国家!!!!!!";
char *q = "我无言以对,只能呵呵。。。。。。";
// 只写的方式打开文件
fd = open("test.txt", O_RDONLY);
if(fd == -1)
{
perror("open");
exit(1);
}
// 使用 F_GETFL 命令得到文件状态标志
flag = fcntl(fd, F_GETFL, 0);
if(flag == -1)
{
perror("fcntl");
exit(1);
}
flag = O_RDWR;
if(fcntl(fd, F_SETFL, flag) == -1)
{
perror("fcntl -- append write");
exit(1);
}
// 再次输入新内容,该内容会追加到旧内容的后面
if(write(fd, q, strlen(q)) == -1)
{
perror("write again");
exit(1);
}
// 关闭文件
close(fd);
return 0;
}