《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. UBOOT分析

    U-Boot是一个通用的Boootloader,它是在系统上电后执行的第一段程序,先初始化硬件设备,再准备软件环境,最后引导系统内核. 一般来说Bootloader的启动过程来说一般分两个阶段: 第一 ...

  2. JNA使用

    JNA与C对应的数据类型: 注意:        使用byte[]对应C++中的char* 可以返回函数执行的结果值 一.添加JNA需要的jar包      1.jna.jar      2.plat ...

  3. 【BZOJ】【3550】【ONTAK2010】Vacation

    网络流/费用流 Orz太神犇了这题…… 我一开始想成跟Intervals那题一样了……每个数a[i]相当于覆盖了(a[i]-n,a[i]+n)这个区间……但是这样是错的!!随便就找出反例了……我居然还 ...

  4. Leetcode#174 Dungeon Game

    原题地址 典型的地图寻路问题 如何计算当前位置最少需要多少体力呢?无非就是在向下走或向右走两个方案里做出选择罢了. 如果向下走,看看当前位置能提供多少体力(如果是恶魔就是负数,如果是草药就是正数),如 ...

  5. string为什么可以写入共享内存

    我今天在想这个vector,map为什么不能写入共享内存,原来是因为new的时候只是new了这个对象在共享内存上,而真正的堆上的内存并没有在共享内存里面的,如果要想vector 可以共享就要重写分配器 ...

  6. Android 4.4 KitKat, the browser and the Chrome WebView

    Having V8 as the JavaScript engine for the new web view, the JavaScript performance if much better, ...

  7. 用fabric部署维护kle日志收集系统

    最近搞了一个logstash kafka elasticsearch kibana 整合部署的日志收集系统.部署参考lagstash + elasticsearch + kibana 3 + kafk ...

  8. 修改DevExpress中英文提示,将英文改为中文

    1 : 修改DX 提示框中的英文字符 /// <summary> /// 重写DX弹出框 英文变为中文 /// </summary> public class CHS : De ...

  9. Java 序列化的高级认识

    序列化 ID 问题 情境:两个客户端 A 和 B 试图通过网络传递对象数据,A 端将对象 C 序列化为二进制数据再传给 B,B 反序列化得到 C. 问题:C 对象的全类路径假设为 com.inout. ...

  10. lintcode:Wiggle Sort II

    Wiggle Sort II Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] ...