Linux C 程序 文件属性,文件删除(15)
dup ,dup2,fcntl,ioctl系统调用
. dup ,dup2 函数 int dup(int oldfd) int dup(int oldfd , int newfd)
dup用来复制参数oldfd的文件描述符
duo2可以用newfd来指定新文件描述符的数值
2.fcntl函数
对已经打开的文件描述符进行各种控制操作,以及改变已经打开文件的各种属性
3.ioctl函数
控制设备,不能用其他函数进行控制操作都可以用ioctl来进行
3.文件属性的操作
1. shell里可通过ls来获取文件属性,那么在程序里怎么获取文件属性呢?
用到stat/fstat/lstat
man stat
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
int stat(const char *file_name,struct stat *buf);
int fstat(int filedes,struct stat *buf);
int lstat(const char *fime_name ,struct stat *buf);
stat 获取由参数file_name指定的文件名的状态信息,保存参数到struct stat *buf中
fstat 与stat 区别,fstat通过文件描述符来指定文件
lstat 与stat,对于符号连接文件,lstat返回的是符号连接文件本身的状态信息。而stat返回的是符号连接文件指向的文件的状态信息。
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
eg:获取文件属性
79,0-1 Bot
#include<stdio.h>
#include<time.h>
#include<sys/stat.h>
#include<unistd.h>
#include<sys/types.h>
#include<errno.h>
int main(int argc , char * argv[]){
struct stat buf;
/*check param number*/
){
printf("Usage mystat <file_name>\n");
exit();
}
/*get file attr*/
],&buf) == -){
perror("stat:");
exit();
}
//print file attr
printf("device is :%d\n",buf.st_dev);
printf("inode is :%d\n",buf.st_ino);
printf("mode is :%d\n",buf.st_mode);
printf("number of hard links is :%d\n",buf.st_nlink);
printf("user ID of owner is :%d\n",buf.st_uid);
printf("group ID of owner is :%d\n",buf.st_gid);
printf("device type (if inode device ) is :%d\n",buf.st_rdev);
printf("total size ,in bytes is :%d\n",buf.st_size);
printf("blocksize for filesystem I/O is :%d\n",buf.st_blksize);
printf("number of blocks allocated is :%d\n",buf.st_blocks);
printf("time of last access is :%s\n",ctime(&buf.st_atime));
printf("time of last modification is :%s\n",ctime(&buf.st_mtime));
printf("time of last change is :%s\n",ctime(&buf.st_ctime));
;
}
output :
[fubin@localhost C]$ ./my_chmod example.c
device
inode
mode
number of hard links
user ID of owner
group ID of owner
device type (
total size ,
blocksize
number of blocks allocated
time of last access ::
time of last modification ::
time of last change ::
2.设置文件属性
chmod/fchmod , chown/fchown/lchown,truncate/ftruncate,utime,umask .chmod/fchmod 修改文件的存取权限 .chown/fchown/lchown 修改文件的用户id和组id .ftruncate/truncate 改变文件大小 .utime 改变文件的st_mtime和st_ctime域,即存取时间和修改时间。 .umask 使用文件创建时使用的屏蔽字
屏蔽文件权限eg:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(){
umask();// don't shield any permission
){
perror("creat");
exit();
}
umask(S_IRWXO);// shield other user's permission
){
perror("creat");
exit();
}
;
}
output:
-rwxrwx---. fubin fubin Jan : umasktest1.txt
-rwxrwxrwx. fubin fubin Jan : umasktest.txt
3.文件的移动和删除
1.文件的移动
rename 修改文件名或移动文件位置
#include <stdio.h>
int rename(const char *oldpath, const char *newpath);
将oldpath文件夹名改为newpath,若newpath存在,则源文件会被删除
用rename实现简单linux下mv的功能
#include<stdio.h>
#include<stdlib.h>
int main(int argc , char **argv){
){
perror("my_mv <oldpath> <newpath>");
exit();
}
],argv[]) < ) {
perror("rename");
exit();
}
;
}
incompatible implicit declaration of built-in function 'exit'
警告:exit函数在stdlib库中,需要包含#include<stdlib.h>进来
2.文件的删除
unlink 文件的删除
rmdir 目录的删除
remove 封装了unlink和rmdir
unlink:文件的链接数为0且没有进程打开这个文件,文件被删除且其占用的磁盘空间被释放。
//如果文件的链接数为0但是有进程打开了这个文件,文件暂时不删除,知道所有打开这个文件的进程结束时文件才被删除。
使用这一点可以确保程序崩溃时,他所创建的临时文件也不会保留。
#include <unistd.h>
int unlink(const char *pathname);
//参数pathname指向一个符号链接,连接被删除。若 指向一个套接字(socket),FIFO(命名管道),设备文件,该名字被删除,但已经打开这个文件的进程仍然可以使用。
3.目录的创建和删除
1.目录的创建 mkdir
2.目录的删除 rmdir
Linux C 程序 文件属性,文件删除(15)的更多相关文章
- linux应用程序开发-文件编程-系统调用方式
在看韦东山视频linux驱动方面有一些吃力,究其原因,虽然接触过linux应用程序编程,但是没有深入去理解,相关函数用法不清楚,正好看到国嵌视频对这一方面讲的比较透彻, 所以把学习过程记录下来,也作为 ...
- linux应用程序开发-文件编程-库函数
---恢复内容开始--- c库函数文件操作独立于具体的系统平台,可移植性较好. 库函数-创建和打开 FILE*fopen(const char*filename,const char*mode) mo ...
- linux中/etc/fstab文件删除或修改了,导致系统无法启动
在linux中,/etc/fstab文件是磁盘挂载的问题,若该文件不小心给修改了,或者被删除了,那么就会导致系统无法重启.因为/etc/fstab文件是记录磁盘挂载的信息,若该文件出现了问题,那么对应 ...
- linux文件属性之linux文件删除原理
Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除.一般来说,每个文件都有2个link计数器:i_count和i_nlink. i_count的 ...
- Linux文件属性之Linux文件删除重要原理详解
Linux下文件删除的原理 只要dongdaxiafile(源文件).服务进程.dongdaxiaflie_hard_link(硬链接文件)三个中的任意一个存在文件不会被删除.
- day59:Linux:编辑工具vim&文件类型&文件属性
目录 1.Linux编辑工具vim 2.Linux文件类型 3.Linux文件属性 4.今日份Linux练习题 Linux编辑工具vim 1.什么是vim 文本文件的编辑工具, 和windows的n ...
- 【Linux】rsync同步文件 & 程序自启动
rsync使用 1. 为什么使用rsync? rsync解决linux系统下文件同步时, 增量同步问题. 使用场景: 线上需要定时备份数据文件(视频资源), 使用rsync完成每天的增量备份. 参见: ...
- 软硬链接、文件删除原理、linux中的三种时间、chkconfig优化
第1章 软硬链接 1.1 硬链接 1.1.1 含义 多个文件拥有相同的inode号码 硬链接即文件的多个入口 1.1.2 作用 防止你误删除文件 1.1.3 如何创建硬链接 ln 命令,前面是源文件 ...
- linux文件删除原理
文件删除的原理 linux的文件名是存在父目录的block里面的,并指向这个文件的inode节点,这个文件的inode节点在标记指向存放这个文件的block的数据块.我们删除文件,实际上不是清除ino ...
随机推荐
- Android 实现书籍翻页效果----升级篇
自从之前发布了<Android 实现书籍翻页效果----完结篇 >之后,收到了很多朋友给我留言,前段时间由于事情较多,博客写得太匆忙很多细节地方没有描述清楚.所以不少人对其中的地方有不少不 ...
- 升级Flash Builder 4.7中的AIR SDK
原文地址:http://helpx.adobe.com/flash-builder/kb/overlay-air-sdk-flash-builder.html本文并没有“忠于”原文翻译. Flash ...
- mysql 支持emoji
1.修改my.cnf [client] default-character-set = utf8mb4 [mysqld] collation-server = utf8mb4_unicode_ci c ...
- SQL SERVER数据库状态(脱机,联机,可疑)及SQL设置语句详解
首先我们应该知道数据库总是处于一个特定的状态中,下面先来了解一下数据库的常见的三种状态:1,脱机:我们可以在Microsoft SQL Server Management中看到该数据库,但该数据库 ...
- mysql数据库问答
一. 问:如果有一张表,里面有个字段为id的自增主键,当已经向表里面插入了10条数据之后,删除了id为8,9,10的数据,再把mysql重启,之后再插入一条数据,那么这条数据的id值应该是多少,是8, ...
- Java(Android)编程思想笔记01:多态性的理解
1. 多态的定义: 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式. (发送消息就是函数调用) 2. 多态的理解 多态是面向对象的重要特性,简 ...
- php核心知识要点
Php:脚本语言,网站建设,服务器端运行 PHP定义:一种服务器端的 HTML 脚本/编程语言,是一种简单的.面向对象的.解释型的.健壮的.安全的.性能非常之高的.独立于架构的.可移植的.动态的脚本语 ...
- linux开机启动配置
vim /etc/rc.d/rc.local 把命令写在这里
- template和templateUrl区别与联系
templateUrl其实根template功能是一样的,只不过templateUrl加载一个html文件,template后面根的是html的标签. .state('menu.about', { u ...
- Eclipse输入任意字母或指定字符出现提示框
Eclipse默认是输入"."的时候会有提示框提示对应的API. 如果想更方便的输入任意字母或者指定的符号出现提示框设置如下: 打开Eclipse,选中“Window”->& ...