系统编程概念(文件系统mount等函数的使用)
挂载文件系统
#include<sys/mount.h>
int mount(const char *source,const char *target,const char *fstype,unsigned long mountflags,const void *data)
其中mountflags的值可为:
MS_BIND 建立绑定挂载,会忽略fstype,data参数
MS_DIRSYNC 同步更新路径,注意只正对路径
MS_MANDLOCK 允许对该文件系统中的文件强行锁定记录
MS_MOVE 令整个动作为一原子操作,不可分割
MS_NOATIME 不更新最后访问时间(使用该标志意在消除额外的磁盘访问,避免每次访问时都更新文件i节点,可提高性能)
MS_NODEV 不允许访问此文件系统上的块设备和字符设备
MS_NODIRATIME 不更新目录的最后访问时间
MS_NOEXEC 不允许在此文件系统上执行程序或脚本
MS_NOSUID 禁用set-user-ID和set-group-ID
MS_RDONLY 以只读方式挂载文件系统,在此文件系统上不能创建和修改文件
MS_REC
MS_RELATIME 只有当文件最后访问时间戳的当前值(上次更新时间)小于或等于最后一次修改或状态更新的时间戳时,才对其进行更新
MS_REMOUNT 针对已经挂载的文件系统,可以改变其mountflag和data
MS_STRICTATIME 只要访问文件,就总是更新文件的最后访问时间戳
MS_SYNCHRONOUS 对文件系统上的所有文件和目录保持同步更新
下面我们来看一下使用mount函数的程序
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<unistd.h>
#include<error.h>
#include<sys/mount.h>
int main(int argc,char *argv[])
{
unsigned long flags;
char *data,*fstype;
int j,opt;
flags=0;
data=NULL;
fstype=NULL;
while((opt=getopt(argc,argv,"o:t:f:"))!=-1)//getopt是获取argc和argv选项的函数,“o:t:f:”代表选项名称为-o,-t,-f,opt用来记录选项的名字,
{
switch(opt)
{
case 'o':
data=optarg;
break;
case 't':
fstype=optarg;
break;
case 'f':
for(j=0;j<strlen(optarg);j++)
{
switch(optarg[j])//逐个读取每个选项参数的内容
{
case 'b':flags|=MS_BIND; break;
case 'd':flags|=MS_DIRSYNC; break;
case 'l':flags|=MS_MANDLOCK; break;
case 'm':flags|=MS_MOVE; break;
case 'A':flags|=MS_NOATIME; break;
case 'V':flags|=MS_NODEV; break;
case 'D':flags|=MS_NODIRATIME; break;
case 'E':flags|=MS_NOEXEC; break;
case 'S':flags|=MS_NOSUID; break;
case 'r':flags|=MS_RDONLY; break;
case 'c':flags|=MS_REC; break;
case 'R':flags|=MS_REMOUNT; break;
case 's':flags|=MS_SYNCHRONOUS;break;
}
}
break;
}
}
if(argc!=optind+2)//因为需要后面两个目标文件和源文件
{
perror("arguments wrong");
exit(1);
}
if(mount(argv[optind],argv[optind+1],fstype,flags,data)==-1)//使用函数不,argv[optind]是目标文件,argv[optind+1]是源文件
perror("mount error");
return 0;
}
卸载文件系统:umount()和umount2()
#include<sys/mount.h>
int umount(const char *target) //target为文件系统挂载点,成功返回0,失败返回-1
int umount2(const char *target,int flags) //成功返回0,失败返回-1,flags可为MNT_DETACH(让已挂载点的进程继续使用,同时禁止新的进程访问该挂载点,当所有进程不再使用访问点时,系统会卸载相应文件系统),MNT_EXPIRE(令挂载点到期),MNT_FORCE(即使文件系统扔处于在用状态,依然强行卸载),UMOUNT_NOFLOLLOW
获取与文件系统有关的信息
#include<sys/statvfa.h>
int statvfs(const char *pathname,struct statvfs *statvfsbuf);
int fstatvfs(int fd,struct statvfs *statvfsbuf) //成功返回0,失败-1
系统编程概念(文件系统mount等函数的使用)的更多相关文章
- Linux/Unix系统编程手册 第三章:系统编程概念
本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...
- linux系统编程:setjmp和longjmp函数用法
#include <stdio.h> #include <setjmp.h> //jmp_buf:数组,保存栈信息即运行环境 jmp_buf buf; double Divid ...
- linux系统编程之错误处理:perror,strerror和errno
1,在系统编程中错误通常通过函数返回值来表示,并通过特殊变量errno来描述. errno这个全局变量在<errno.h>头文件中声明如下:extern int errno; errno是 ...
- Linux/Unix系统编程手册 第二章:基本概念
本章预热与后续系统编程有关的概念. 术语“操作系统”通常包含2种含义:一是指完整的软件包,包括管理计算机资源的核心组件,已经附带的标准软件:二是独指管理硬件的内核. 内核具有诸多概功能,包括: 进程管 ...
- Linux 系统编程 学习:00-有关概念
Linux 系统编程 学习:00-有关概念 背景 系统编程其实就是利用系统中被支持的调度API进行开发的一个过程. 从这一讲开始,我们来介绍有关Linux 系统编程的学习. 知识 在进行Linux系统 ...
- Linux 系统编程 学习:01-进程的有关概念 与 创建、回收
Linux 系统编程 学习:01-进程的有关概念 与 创建.回收 背景 上一讲介绍了有关系统编程的概念.这一讲,我们针对 进程 开展学习. 概念 进程的身份证(PID) 每一个进程都有一个唯一的身份证 ...
- Linux 系统编程 学习:06-基于socket的网络编程1:有关概念
Linux 系统编程 学习:006-基于socket的网络编程1:有关概念 背景 上一讲 进程间通信:System V IPC(2)中,我们介绍了System IPC中关于信号量的概念,以及如何使用. ...
- Linux系统编程-setitimer函数
功能:linux系统编程中,setitimer是一个经常被使用的函数,可用来实现延时和定时的功能. 头文件:sys/time.h 函数原型: int setitimer(int which, cons ...
- 05-Linux系统编程-第02天(文件系统、目录操作、dup2)
1 课程回顾 02-文件存储 文件名不在inode里 而是保存在一个叫dentry的结构体里了 格式化就是指定一组规则 指定对文件的存储及读取的一般方法 linux下主要使用 ext2 ext3 ex ...
随机推荐
- vue组件的使用和事件传递
子组件与父组件的事件传递具体实现如下: 子组件: <template> <section class="xftz-data-list"> <div c ...
- 查看json数据更新情况
#! python3 # -*- coding:utf8 -*- #主要为读取excel中接口地址,打开网页爬取url页面中数据,解析json,检查是否符合逻辑(正常) import requests ...
- C++类型转换的注意事项
1.如果两个类型可以相互转换,就说他们是关联的. 2.隐式转换是指,由编译器自行转换,而不需要程序员介入的转换. 3.以下情况,编译器会发生隐式转换: 1)在大多数表达式中,比int类型小的整型值会被 ...
- 《图解TCP/IP》读书笔记(转)
reference: https://www.cnblogs.com/edisonchou/p/5987827.html 一.国际惯例:书托 这是一本图文并茂的网络管理技术书籍,旨在让广大读者理解TC ...
- CAN总线(1)--初探(更新中)
前言: CAN总线可以控制可以使用Xilinx中IP核来直接实现,也可以使用专用的CAN芯片(例如:SJA1000)通过单片机和FPGA驱动控制来实现: 目前是使用控制器SJA1000来进行实现: C ...
- SharePoint online Multilingual support - Settings
博客地址:http://blog.csdn.net/FoxDave This post will talk about how to enable sharepoint online site mul ...
- 创建vue项目
1.创建项目 vue creat 项目名 // 要提前进入目标目录(项目应该创建在哪个目录下) // 选择自定义方式创建项目,选取Router, Vuex插件 2.启动/停止项目 npm run se ...
- 使用OpenBTS基站测试物联网模块安全性
0×00 引子 近年来,随着云计算.物联网技术的快速发展,物联网的理念和相关技术产品已经广泛渗透到社会经济民生的各个领域,越来越多的穿戴设备.家用电器通过蓝牙.Wi-Fi.Li-Fi.z-wave.L ...
- ORACLE中使用DBMS_RANDOM去产生随机数
一.生成随机字符串:DBMS_RANDOM.STRING 用法:DBMS_RANDOM.STRING(选项, 返回字符串长度) 选项有如下几种可供选择:1)'u', 'U' - returning s ...
- 记第二届CCPC全国女生赛参赛体验
离比赛时间已经有点久了,今天整理博客看到“”参赛体会“”这一分类,觉得记录一下也好 流水账记一下感受 因为题目我已经忘记了.. 第一次..那么久..大概有三个多小时在金牌区吧.. 然后就是一无所出了. ...