《Linux/Unix系统编程手册》读书笔记 目录

第9章

这章主要讲了一堆关于进程的ID。实际用户(组)ID、有效用户(组)ID、保存设置用户(组)ID、文件系统用户(组)ID。和辅助组ID。

实际用户ID决定执行者是谁。

有效用户ID决定该进程执行时获取的文件权限。PS:有效用户ID为0的进程拥有超级用户的所有权限。

认识保存设置用户ID(saved set-user-ID)的时候先来看看设置用户ID(set-user-ID)(对于文件的)。

如果可执行文件设置了设置用户ID,当该文件执行的时候会将该进程的有效用户ID设置为执行文件的用户ID。

例如当某个执行文件的用户ID为root,而且设置了设置用户ID,那么如果某用户(非root)运行该文件的时候,该进程的有效用户ID就会变成root,也就是0,从而获取超级进程用户权限。例如passwd,ping。这两个文件的所属都属于root,但是这两个文件可以不以root来执行。通过ls -l可以看到它们设置了set-user-ID位。

lancelot@debian:~$ ls -l /bin/ping
-rwsr-xr-x root root 4月 /bin/ping
lancelot@debian:~$ ls -l /usr/bin/passwd
-rwsr-xr-x root root 5月 /usr/bin/passwd

然后我们来看一个详细的例子:

一个可执行文件check_password要根据/etc/shadow来检查密码是否正确,但是访问/etc/shadow需要权限。

lancelot@debian:~/Code/tlpi$ ls -l check_password
-rwxr-xr-x lancelot lancelot 4月 : check_password
lancelot@debian:~/Code/tlpi$ ./check_password
Username: lancelot
ERROR: no permissong to read shadow password file

然后我们先修改它的用户ID,再设置设置用户ID权限位。然后来看看运行结果。

lancelot@debian:~/Code/tlpi$ sudo chown root check_password
lancelot@debian:~/Code/tlpi$ sudo chmod u+s check_password
lancelot@debian:~/Code/tlpi$ ls -l check_password
-rwsr-xr-x root lancelot 4月 : check_password
lancelot@debian:~/Code/tlpi$ ./check_password
Username: lancelot
Password:
Successfully authenticated: UID=

好了,现在来看看保存设置用户ID了,其实就是进程的有效用户ID的副本。

文件系统用户ID决定文件系统操作的权限。其值通常与有效用户ID相同。PS:当有效用户ID发生改变,文件系统用户ID也会紧接着发生改变(变成相同的值)。

获取实际用户和有效用户ID

 #include <unistd.h>

 uid_t getuid(void);      //返回调用进程的实际用户ID

 uid_t geteuid(void);    //返回调用进程的有效用户ID

 gid_t getgid(void);      //返回调用进程的实际组ID

 gid_t getegid(void);   //返回调用进程的有效组ID

修改有效ID:

 #include <unistd.h>

 int setuid(uid_t uid);

 int setgid(gid_t gid);

成功修改返回0,失败返回-1。

PS:非特权进程(有效ID为0)调用修改有效ID时,只能修改进程的有效用户ID(将其值设置为实际用户ID和保存设置用户ID)。当特权进程调用修改有效ID时,实际用户ID、有效用户ID和保存设置用户ID均会设置为uid的值。

 #include <unistd.h>

 int seteuid(uid_t euid);

 int setegid(gid_t egid);

成功修改返回0,失败返回-1。

PS:非特权进程仅能将有效用户ID设置为实际用户ID或者保存设置用户ID。特权进程可以将有效用户ID设置为任意值。

修改实际ID和有效ID

#include <unistd.h>

int setreuid(uid_t ruid, uid_t euid);

int seregid(gid_t rgid, gid_t egid);

成功修改返回0, 失败返回-1。

第一个参数为新的实际ID,第二个参数为新的有效ID。如果只修改其中一个,可以将另一个的值设置为-1。

获取实际、有效和保存设置ID:

 #define _GNU_SOURCE
#include <unistd.h> int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);

成功获取返回0,失败返回-1。

修改实际、有效和保存设置ID:

 #define _GNU_SOURCE
#include <unistd.h> int setresuid(uid_t ruid, uid_t euid, uid_t suid); int getresgid(gid_t rgid, gid_t egid, gid_t sgid);

成功修改返回0, 失败返回-1。

如果不想修改的ID,可以设置为-1。

获取和修改文件系统ID:

 #inlcude <sys/fsuid.h>

 int setfsuid(uid_t fsuid);

 int setfsgid(gid_t fsgid);

--------------------------------------------------------省略辅助组ID----------------------------------------------

第10章

这章主要讲了时间的概念。时间分为两种类型:1、真实时间;2、进程时间。

真实时间:

一、日历时间,用于对记录或文件打上时间戳。

二、流逝时间或挂钟时间,用于需要周期性操作或定期从外部输入设备进行度量的程序。

日历时间:

UNIX系统内部对时间的表示方式是自1970年1月1日早晨零点以来的秒数。

 #include <time.h>

 time_t time(time_t *timep);

返回自1970年1月1日早晨零点以来的秒数,出现错误返回-1。

如果timep为NULL,直接返回自1970年1月1日早晨零点以来的秒数,如果不为NULL,还会讲秒数置于timep所指向的位置。

获取到秒数后就要通过一些函数将秒数转成人类可读的格式。

通过ctime:

 #include <time.h>

 char *ctime(const time_t *timep);

返回指向静态分配的字符串的指针,出现错误返回NULL

 #include <stdio.h>
#include <time.h> int main(int argc, char *argv[]){
time_t t = time(NULL);
printf("%s\n", ctime(&t));
return ;
}

结果:

 lancelot@debian:~/Code/tlpi$ ./a.out
Sat Apr ::

有时候我们不仅需要将时间转成可打印的格式,还需要将时间分解成很多独立字段。这个时候就需要用到gmtime()或者localtime()。

 #include <time.h>

 struct tm *gmtime(const time_t *timep);

 struct tm* localtime(const time_t *timep);

返回指向静态分配的字符串的指针,出现错误返回NULL。gmtime返回的是对UTC的分解时间,localtime返回的是对系统本地时间的分解时间。

如果现在存在一个分解时间,可以通过mktime来输出其对应的秒数。

 #include <time.h>

 time_t mktime(struct tm *timeptr);

返回自1970年1月1日早晨零点以来到分解时间的秒数,出现错误返回-1。

我们还可以对分解时间进行转换,转换成可打印时间。

 #include <time.h>

 char *asctime(const struct tm *timeptr);

返回指向静态分配的字符串的指针,错误返回NULL。

------昨晚睡觉前开始写的。。。。感觉好像搞懂了那一对关于进程的ID。。。。。还是挺开心的

------在看到别人的收获的时候,还要看到别人付出的血汗。正因为你不够别人勤奋,所以你才落后别人

------好好努力,为了9月份的校招!!!!!!!!还有时间!!!!!!!

《Linux/Unix系统编程手册》读书笔记6的更多相关文章

  1. 《Linux/Unix系统编程手册》读书笔记 目录

    <Linux/Unix系统编程手册>读书笔记1  (创建于4月3日,最后更新4月7日) <Linux/Unix系统编程手册>读书笔记2  (创建于4月9日,最后更新4月10日) ...

  2. 《Linux/Unix系统编程手册》读书笔记9(文件属性)

    <Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...

  3. 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

    <Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...

  4. 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)

    <Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...

  5. 《Linux/Unix系统编程手册》读书笔记5

    <Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/g ...

  6. 《Linux/Unix系统编程手册》读书笔记4

    <Linux/Unix系统编程手册>读书笔记 目录 第7章: 内存分配 通过增加堆的大小分配内存,通过提升program break位置的高度来分配内存. 基本学过C语言的都用过mallo ...

  7. 《Linux/Unix系统编程手册》读书笔记3

    <Linux/Unix系统编程手册>读书笔记 目录 第6章 这章讲进程.虚拟内存和环境变量等. 进程是一个可执行程序的实例.一个程序可以创建很多进程. 进程是由内核定义的抽象实体,内核为此 ...

  8. 《Linux/Unix系统编程手册》读书笔记1

    <Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...

  9. 《Linux/Unix系统编程手册》读书笔记2

    <Linux/Unix系统编程手册>读书笔记 目录 第5章: 主要介绍了文件I/O更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以 ...

随机推荐

  1. 如何让Asp.net Web Api全局预防Xss攻击

    一.概述 二.什么是XSS 三.预防方法 四.在WebApi中如何实现 在实现之前,需要了解ASP.NET WEB API的pipeline机制. 如上,可以采用多种方式进行参数的过滤 1.重写Del ...

  2. C Shell 中的特殊变量

    恢复 $0,当前脚本的文件名 $n,传递给脚本或函数的参数,n是一个数字,表示第几个参数 $#,传递给脚本或函数的参数个数 $*,传递给脚本或函数的所有参数 $?,函数的返回值 $$,当前shell的 ...

  3. django-CSRF verification failed. Request aborted

    现象: 解决办法1: 在view.py文件中设置如下: from django.views.decorators.csrf import csrf_exempt @csrf_exempt #再写下面的 ...

  4. hdu 1028 Ignatius and the Princess III

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1028 题目大意:3=1+1+1=1+2=3 :4=4=1+1+1+1=1+2+1=1+3:所以3有3种 ...

  5. 【BZOJ】【1031】【JSOI2007】字符加密Cipher

    后缀数组 当年感觉好神的题现在好像变水了…… 题意其实有点蛋疼……一开始没看懂<_< 将原串复制一遍接在后面,用后缀数组求一下SA,那么SA<n的就是所找到的那n个字符串,然后把它们 ...

  6. css hack一览

    浏览器对css hack的支持情况

  7. IE6 IE7 IE8(Q) 不支持 JSON 对象

    标准参考 JSON 是一种数据交换格式,RFC 4627 对 JSON 进行了详细描述. 根据 ECMA-262(ECMAScript)第 5 版中描述,JSON 是一个包含了函数 parse 和 s ...

  8. BZOJ2199: [Usaco2011 Jan]奶牛议会

    趁此机会学了一下2-SAT. 以前的2-SAT都是用并查集写的,只能应用于极小的一部分情况,这次学了一正式的2-SAT,是用一张有向图来表示其依赖关系. 2-SAT的介绍参见刘汝佳<训练指南&g ...

  9. 时序列数据库武斗大会之 OpenTSDB 篇

    [编者按] 刘斌,OneAPM后端研发工程师,拥有10多年编程经验,参与过大型金融.通信以及Android手机操作系的开发,熟悉Linux及后台开发技术.曾参与翻译过<第一本Docker书> ...

  10. 请教DotNetBar控件中的CalendarView控件如何拖动当前的时间轴

    本人想拖动那个当前的时间轴或者让时间轴变动,因为那个时间轴默认的是当前时间.(就是那个黄色的线)