title: linux/unix编程手册-16_20 date: 2018-06-06 11:53:07 categories: programming tags: tips

linux/unix编程手册-16(扩展属性EA)

EA的命名空间

  • user EA 只适用于文件或目录 (ext2~4上创建时需要:mount -o user_xattr device dir)
  • trusted
  • system
  • security 略

linux/unix编程手册-17(访问控制表)

ACL

  • 文件系统支持ACL需要 mount -o acl
  • 简单来说ACL是对原有文件系统权限的扩展
    • 原有文件系统只针对owner,group和other, ACL支持对单独用户进行权限设置
  • ACL由一系列ACE组成,ACE由三部分组成
    • 标记类型
    • 标记限定符(可选,一般为用户ID或组ID,下图带-表示不可选,同时只存在一条此类型)
    • 权限集合
  • 示例
  • 最小ACL:和普通文件权限集合一样只包含ACL_XX_OBJ, ACL_OTHER

ACL检查算法

  • 进程具有特权,执行权限需要至少一条ACL匹配才有,其他同普通文件权限
  • 进程的有效用户ID(准确是文件ID下面略)匹配文件的属主,授予ACL_USER_OBJ的ACE指定权限
  • 进程的有效用户ID匹配了一条ACL_USER,授予权限为ACL_MASK & ACE指定
  • 进程组匹配类似(有效组ID和辅助组任意一匹配,只是匹配了ACL_GROUP_ACE后权限需要& ACL_MASK)
  • ACL_OTHER 授予的权限

chmod之后ACL_MASK的作用及其他api调用 略太杂了之后有使用再记吧

linux/unix编程手册-18(目录和(硬)链接)

目录和硬链

目录的inode示例

  • inode可能会有多个文件名(多个硬链接),无法通过描述符找到文件名
  • inode仅在同一文件系统中唯一,硬链得在同一文件系统
  • inode目录无法硬链

软连接(符号链接)

  • _POSIX_SYMLOOP_MAX_ 解引用操作限制<limits.h>
  • 软链存储的优化,路径名小于60时可以直接存在存data指针的位置
  • l开头的系统调用往往操作的符号链接文件本身(但是文件的目录如果是软链,则都会解引用)
  • 除了sticky设置的目录下的软链文件(/tmp)进行删除和重命名的情况外,文件的操作的权限为解引用之后的文件权限。
  • 硬链了一个软链,linux不会解引用,MAC会。
文件的删除

即使所有指向这个inode的硬链都解除了,但是又进程持有改文件的描述符(因为可以通过打开文件的表找到对应的inode),在关闭描述符之前,系统实际不会删除改文件

  • tmpfile 的实现大致应该类似
f = open("tmp_file", O_CREATE|O_EXCL)
err =unlink("tmp_file")
复制代码
#include<unistd.h>
int remove(const char *pathname);
// pathname为文件调用unlink, 否则调用rmdir,均不解引用。
复制代码

目录的操作略

进程目录的操作略

linux/unix编程手册-19(监控文件事件)

inotify API

#include<sys/inotify.h>// return inotify fd
int inotify_init(void);// return wd; need read privellege on pathname
int inotify_add_watch(int fd, const char *pathname, uint32_t mask);// 删除fd里面的wd
int inotify_rm_watch(int fd, uint32_t wd);复制代码
  • fd,wd一对多

  • 每次调用read 读取fd ,如果不传O_NONBLOCK会阻塞,传参的话read会立刻失败并报错EAGAIN

struct inotify_event {int wd;uint32_t mask;uint_32 cookie;   // cookie for relate events(ex:rename())uint32_t len;    //sizeof namechar name[];    // 监控为目录时返回文件名,为文件返回空,len为0
}
复制代码
  • 在事件队列末尾追加一个新事件会和当前对尾比较,如果struct一致,则合并,忽略多次。
  • /proc/sys/fs/inotify/保存inotify的各种限制
    • max_queue_events
    • max_user_instances
    • max_user_watches

linux/unix编程手册-20(信号:基本概念)

信号是事件发生时对进程的通知机制:也叫软件中断

信号通常源于内核

  • 硬件发生异常:被0除,内存访问错误等
  • 用户键入产生异常特殊字符:Ctrl+c,Ctrl+z
  • 软件事件:CPU时间超时等等

信号的分类

  • 标准信号(内核像进程通知事件,通常是1-31)
  • 实时信号

进程对信号的反馈

  • 忽略信号
  • 杀死进程(非调用exit终止)
  • 产生核心转储文件并终止
  • 停止进程
  • 恢复停止
  • 采取默认(用于恢复对默认的修改)
  • 忽略默认终止信号
  • 执行编写的信号处理程序(如Ctrl+c, 无法直接设置处理程序杀死进程或产生核心转储文件,可以通过间接调用abort来产生新的信号)

信号类型和默认行为

  • SIGABRT: 调用abort()会产生,会杀死进程并产生核心转储文件供调试
  • SIGALARM: 调用alarm()setitimer()设置定时器到时间,内核会产生该信号
  • SIGBUS: 内存访问错误
  • SICHLD|SIGCLD: 子进程终止时发给父进程
  • SIGCONT: 恢复停止进程
  • .......
  • SIGTERM:标准杀死进程信号kill|killall 会发起
  • SIGKILL: 必杀信号,处理程序无法将其阻塞,忽略或 捕获(测试下);kill -9|kill -KILL会调用

改变信号

#include<signal.h>void ( *signal(int sig, void (*handler)(int))) (int);//成功返回之前的调用函数地址或者SIG_DFL(设为默认值)或SIF_IGN(忽略),失败时返回SIG_ERR
//正常开发不要使用signal,兼容性不好
复制代码
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>static void sigHandler(int sig){printf("Ouch\n");
}int main(void){if (signal(SIGINT, sigHandler)==SIG_ERR){printf("error");exit(-1);}for (;;){printf("*****************************");sleep(3);}
}复制代码

发送信号

#include<signal.h>int kill(pid_t pid, int sig);
复制代码
  • pid>0, 发送给pid进程
  • pid=0, 发送给同组所有进程
  • pid<-1, 发送给pid绝对值进程组内所有进程
  • pid=-1 发送给除了init进程和自身之外的所有有权进程

发送的权限

  • 特权进程可以发给所有
  • root用户和组运行的init进程,仅接受安装了处理器函数的信号
  • 非特权进程
  • SIGCONT信号忽视用户ID检测,非特权进程可以向会话内任意进程发送这一信号

sig=0,仅报告进程是否存在

其他发送信号调用

#include<signal.h>int raise(int sig);
//单线程下等于
kill(getpid(), sig)
//支持线程系统下
pthread_kill(pthread_self(),sig)int killgp(pid_t pgrp, int sig);
//等同于
kill(-pgrp, sig)
复制代码

信号集

#include<signal.h>// 初始化空的set
int sigemptyset(sigset_t *set);// 初始化包含所有信号(包括实时信号)的set
int sigfillset(sigset_t *set);int sigaddset(sigset_t *set, int sig);int sigdelset(sigset_t *set, int sig);int sigismember(const sigset_t *set, int sig);
复制代码
#define _GNU_SOURCE
#include<signal.h>int sigandset(sigset_t *dest, sigset_t *left, sigset_t *right);int sigorset(sigset_t *dest, sigset_t *left, sigset_t *right);int sigisemptyset(const sigset_t *set);复制代码

信号掩码

内核会为每个进程维护一个信号掩码,即一组信号,并阻塞这些信号对进程的传递,一直延迟直至解除(每个线程可单独控制)


#include<signal.h>int sigprocmask(int how, const sigset_t *set, sigset_t *old_set);// how=SIG_BLOCK, 当前进程和set取并集
// how=SIG_UNBLOCK, 移除set内信号
// how=SIG_SETMASK, 赋值为set内信号
// oldset不为空则指向之前的信号掩码
// set为空不做改动复制代码
#include<signal.h>
#include<stdlib.h>int main(void){sigset_t blockSet, prevMask;sigemptyset(&blockSet);sigaddset(&blockSet, SIGINT);if (sigprocmask(SIG_BLOCK, &blockSet, &prevMask)==-1){exit(-1);}if (sigprocmask(SIG_SETMASK, &prevMask, NULL) == -1){exit(-1);}retunn 0;
}
复制代码

获取等待信号

#include<signal.h>int sigpending(sigset_t *set);// 标准信号同一信号只会记录一次,实时信号之后会有排队处理见22章
复制代码

改变信号二

#include<signal.h>int sigaction(int sig, const struct sigaction *act, struct sigaction *oldact);//act 新处置的数据结构,为NULL则忽略,oldact置位将当前处置struct sigaction{void (*sa_handler)(int); // 调用函数地址或者SIG_DFL,SIF_IGN, 为函数地址时sa_mask和sa_flags才有效sigset_t sa_mask;       //调用函数时可额外阻塞一组信号int sa_flags;           //略....太多标记了void (*sa_restorer)(void); //系统内部使用,供恢复上下文
}
复制代码
  • 执行处理器程序时,同一信号第二次到达,如果没有设为阻塞会忽略,设为阻塞的话会保留一次
#include<unistd.h>int pause(void);// 进程一直停止直到有处理函数的信号,或者一个未处理信号终止进程
复制代码

linux/unix编程手册-16_20相关推荐

  1. linux/unix编程手册-56_60

    title: linux/unix编程手册-55_56 date: 2018-10-05 11:53:07 categories: programming tags: tips linux/unix编 ...

  2. linux/unix编程手册-61_64

    title: linux/unix编程手册-61_64 date: 2018-10-07 11:53:07 categories: programming tags: tips linux/unix编 ...

  3. linux/unix编程手册-6_10

    title: linux/unix编程手册-6_10 date: 2018-05-15 11:53:07 categories: programming tags: tips linux/unix编程 ...

  4. Linux系统编程手册-源码的使用

    Linux系统编程手册-源码的使用 转自:http://www.cnblogs.com/pluse/p/6296992.html 第三章后续部分重点介绍了后面章节所要使用的头文件及其实现,主要如下: ...

  5. 学习linux/unix编程方法的建议[转]

    首先先学学编辑器,vim, emacs什么的都行. 然后学make file文件,只要知道一点就行,这样就可以准备编程序了. 然后看看<C程序设计语言>K&R,这样呢,基本上就可以 ...

  6. 学习linux/unix编程方法的建议-转

    假设你是计算机科班出身,计算机系的基本课程如数据结构.操作系统.体系结构.编译原理.计算机网络你全修过  我想大概可以分为4个阶段,水平从低到高  从安装使用=>linux常用命令=>li ...

  7. 我把某大厂P8大能手写的 Linux+网络编程 手册搞到手了

    时间飞逝,转眼间毕业七年多,从事 Java 开发也六年了.我在想,也是时候将自己的 Java 整理成一套体系. 这一次的知识体系面试题涉及到 Java 知识部分.性能优化.微服务.并发编程.开源框架. ...

  8. linux c 编程手册,Linux C/C++编程手册查阅方法

    Linux Programmer's Manual & User Commands https://www.kernel.org/doc/man-pages/ 搜索框输入epoll调用搜索引擎 ...

  9. linux unix编程思想,Unix网络编程思想

    本次博客主要总结参考<Unix网络编程>卷一前四章的知识,对TCP一对一通信进行重新改造和分析,经典就是经典,无可替代! 一.为什么使用包裹函数 任何现实世界的程序都必须检查每个函数调用是 ...

最新文章

  1. linux 安装jdk tar.gz
  2. 定制Eclipse IDE之插件篇(一)
  3. Virtual Machine--Vmware(2)
  4. Dreamweaver——模板与库
  5. CH0103最短Hamilton路径 poj2288 Islands and Brigdes【状压DP】
  6. 211计算机实力末尾的学校,实力最弱的十所985大学是哪几所?选择末尾985好还是选211好?...
  7. 分页第一页用0还是1_如何设计api分页
  8. 2022年推出?特斯拉人形机器人被批就是个笑话
  9. Mac mysql 忘记 root 密码,phpmyadmin 登录 No such file or directory 错误处理
  10. C++基础——类继承中方法重载
  11. Linux版Silverlight - Moonlight宣布停止更新
  12. php教程phpmeng,李炎恢PHP培训视频教程
  13. UITextView使用与YYlabel使用比较
  14. 【方法】如何提高专注能力
  15. 算法设计与分析: 2-13 标准二维表问题
  16. Google Sketchup 三维建模软件(含建筑装修摆设资源,包括 office)
  17. 树莓派3B+ 安装 `ReSpeaker 4-Mics Pi HAT` 声卡,录音与播放
  18. UEFI Application
  19. 【Hack The Box】windows练习-- love
  20. 医疗图像三维重建方法小结(python+VTK+ITK+Mayavi)

热门文章

  1. mysql读写分离实战准备一
  2. linux自定义和使用 shell 环境(一)
  3. Maven 搭建spring boot多模块项目(附源码)
  4. 四层负载均衡和七层负载均衡的区别
  5. 我也谈javascript闭包
  6. 再次遇到的问题:Unable to load dynamic library myext.so: undefined symbol
  7. bash漏洞修补, CVE-2014-6271
  8. Android中使用HttpClient实现HTTP通信效果
  9. 获取Java接口的所有实现类
  10. 【DRF框架】序列化组件——字段验证