重读APUE(6)-umask】的更多相关文章

umask函数设置当前进程的权限为屏蔽字:系统会有一个默认的屏蔽字,为了确保创建文件具有的权限位成功被设置,需要使用umask将屏蔽字置0: 系统屏蔽字用shell查看,比如得到如下结果,其为八进制表示形式,以0开头:这个屏蔽字表示屏蔽掉了组的写和其他的写权限: 下面的例子很好的说明了umask的使用,首先使用umask(0)将屏蔽字置0,此时新建foo文件,可见其具有设置的全部读写权限:而后用umask屏蔽掉组和其他的读写位,新建bar,可见bar之具有用户读写权限: 另外需要注意的是,进程设…
下图为调用dup之后的文件指针状态,包含如下信息: 1. dup选择了一个最小的未使用的描述符3: 2. dup(1)之后,描述符1和描述符3指向同一个文件表项: 3. dup(1)的返回值即为复制得到的描述符3: 4. 补充dup2,dup2可以指定复制的目标描述符,如果该描述符与被复制的描述符相同,会直接返回该描述符:如果不同,则会先关闭描述符,然后进行复制:注意,dup2的关闭和复制操作是原子的: 5. 补充open,进程每一次open调用都会打开一个新的文件表项,一个新的描述符指向这个文…
即使pthead_cond_wait()和pthread_cond_timewait()没有错误返回,等待的条件也可能是假的:即使pthread_cond_timewait()返回了超时错误,关联的条件也可能是真的:因为超时和条件改变之间有时间窗口: 在有些实现中,特别是多处理器环境,信号唤醒可能会同时唤醒多个处理器上的多个线程: 通常,不管pthread_cond_wait()返回什么,都要对条件进行重新判断,以确定下一步动作,或者继续执行,或者继续等待: 因此,推荐使用while循环来对等待…
在main中创建线程,我们称main线程为主线程,新建线程为子线程(其实没有什么主线程和子线程的父子概念,它们是平行的,为了好理解这样称呼),如果子线程内部执行相对比较耗时的操作,主线程执行的快,而且没有等待子线程执行完毕,此时主线程退出,进程被销毁,就会导致子线程无法执行完毕: 可以采用如下方式确保子线程执行完毕: 1. 主线程中采用pthread_join阻塞等待子线程结束,并回收资源: man手册对于该函数的描述: The pthread_join() function waits for…
在信号产生和传递之间有一段时间间隔,称为信号是未决的: 进程可以设置阻塞信号传递:如果进程产生了一个阻塞的信号,并且对该信号的动作是系统默认或者捕捉该信号,则该进程保持此信号为未决状态,直到该进程对此信号接触阻塞,或者将对该信号的动作改为忽略:内核在传递一个原来被阻塞的信号给进程时(而不是产生该信号时),才决定对它的处理方式:这样就意味着进程在信号传递给它之前仍然可以改变对该信号的动作:进程调用sigpending函数来判断哪些信号是设置为阻塞并处于未决状态的: 如果进程在解除对某个信号的阻塞之…
SIGCHLD信号是当子进程终止时向父进程发送的信号:它的语义如下: 如果进程明确的将该信号设置为SIG_IGN,则调用进程不会产生僵尸进程:这种情况下,wait是等不到给子进程收尸的,所以wait阻塞到所有子进程终止后,返回-1,并且将errno设置为ECHILD: 如果进程没有明确的设置捕获该信号,那么将会是默认处理SIG_DFL(忽略),这种情况下,如果不使用wait函数,会产生僵尸进程: 如果进程明确的设置捕获该信号,则内核立即检查是否子进程准备好被等待,如果是,则调用SIGCHLD处理…
重入时间点 进程捕捉到信号并对其进行处理时,进程正在执行的正常指令序列就会被信号处理程序临时中断,它首先执行该信号粗合理程序中的指令:如果从信号处理程序返回,则继续执行捕捉到信号时进程正在执行的正常指令序列: ps:如果了解驱动,上面这段信号打断流程与中断打断进程上下文很类似: 不可重入函数 对于有些函数,是不可重入的,如果信号处理程序打断了这些函数的执行,同时信号粗合理程序中也调用这个函数,就会发生错误:这些不可重入的函数,有如下特点: 1. 使用了静态的数据结构: 2. 调用了malloc或…
如果进程在执行一个低速系统调用而阻塞期间捕获到一个信号,则该系统调用就会被中断而不再继续执行:该系统调用返回出错,其errno设置为EINTR: 系统将系统调用分成两类:低速系统调用和其他系统调用:低速系统调用是可能会使进程永远阻塞的一类系统调用,包括: 1. 如果某类型文件(如读管道,终端设备,网络设备等)的数据不存在,则读操作可能会使调用者永远阻塞: 2. 如果数据不能被相同类型的文件立即接受,则写操作可能会使调用者永远阻塞: 3. 在某种条件发生之前打开某些类型文件,可能会发生阻塞(如要打…
下面这几个函数定义,每次看到都会纠结一阵子,奇怪的是为什么没有参数? #define SIG_ERR (void (*)())-1 #define SIG_DFL (void (*)())0 #define SIG_IGN (void (*)())1 函数signal的回调明明是下面这样的,void (*func)(int)),有个int类型的参数: void (*signal(int signo, void (*func)(int)))(int); 其实这个问题以前也写过一篇文章<C函数前向声…
进程: 是系统中一段程序执行的实体,也是资源分配和调度的基本单位: 进程组: 为了方便管理多个进程,可以将多个进程加入到一个进程组内: 每个进程都属于一个进程组,但是同一个进程组内可以有多个进程: 每个进程组有一个组长ID,进程组ID等于其进程ID: 进程组的存在周期与组长无关,即使进程组长已经停止,组内还有其他进程,则进程组依然存在: 会话: 是一个或者多个进程组的集合: 一个会话可以有一个控制终端: 建立与控制终端连接的会话首进程被称为控制进程: 一个会话中的几个进程可被分成一个前台进程组和…
link–用于创建一个现有文件的链接:实际上是新建一个目录项,指向当前文件的i节点: unlink–用于删除一个现有文件的连接:实际上是对引用i节点的目录项进行删除,并且对链接计数-1:系统会检查文件被进程的引用计数(如被进程打开,引用计数会+1,关闭则-1),如果该引用计数为0,并且链接计数为0,则会删除该文件: 比如shell中的rm命令,就是使用unlink函数实现的: mkdir–用于创建一个新的空目录,目录中只包含. 和 ..: rmdir–用于删除一个空目录,也就是只能删除包含.和.…
文件,目录,权限 1. 用名称打开任一个类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应该具有执行权限:这就是目录执行权限通常被称为搜索位的原因: 例如:为了打开文件/usr/include/stdio.h,需要对目录/./usr./usr/include具有执行权限:而具有对文件本身的适当权限,取决于以何种模式打开它: 注意:对目录的读权限和执行权限的意义是不同的,读权限允许我们读目录,获得在该目录中的所有文件名的列表:而执行权限决定是否有资格搜索该目录: 2. 对于…
fcntl(File Control)-文件控制 ioctl(In/Out Control)-I/O控制 1. fcntl作用于文件,提供对文件的基础控制:ioctl作用于文件和设备对象,一般用来向设备发送命令,或者控制设备属性: 2. fcntl是系统预先定义好的命令选项,不能自定义:ioctl可以通过驱动程序自定义,驱动程序中可以通过file_operations->unlocked_ioctl实现针对特定设备的定制命令控制:…
返回值: 成功返回读到的字节数,如果达到文件尾,则返回0:注意:如果有数据第一次读取会返回全部读到的字节数,下一次读取才会返回0: 出错返回-1: 返回值少于要求读取字节数的情况: 1. 读取普通文件时,在读到要去字节数之前达到了文件尾,如:在达到文件尾之前有30个字节,而要求读取100个字节,则read返回30:下一次再调用read时,它将返回0(文件尾): 2. 当从终端设备读取时,通常一次最多读取一行: 3. 当从网络设备读取时,网络中的缓冲机制可能造成返回值小于要求读取的字节数: 4.…
lseek使用的注意事项: 1. lseek的返回值,成功返回新的文件偏移量,失败返回-1,不能用<0判断:因为文件偏移量可能是正的,也可能是负的,所以不能使用<0判断成功与否:注意:对于普通文件,偏移量必须是非负的:但比如Intel x86处理器上运行的FreeBSD设备/dev/kmem就支持负的偏移量: 2. lseek只是把文件偏移量存在内核中,用于下一次的读或者写,并不会引起IO操作:lseek系统调用实际上最后会调用内核的file_operations->llseek函数:…
这章节内容比较紧凑,主要有5部分: 1. 守护进程的特点 2. 守护进程的构造步骤及原理. 3. 守护进程示例:系统日志守护进程服务syslogd的相关函数. 4. Singe-Instance 守护进程. 5. 其他相关内容 1. 守护进程的特点 守护进程也是unix系统中的一种进程.有大量的系统守护进程,其最主要的特点有两个: (1)系统启动的时候守护进程就跟着起来:只有当系统关闭的时候守护进程才跟着关闭 (2)没有controlling terminal,运行在background 直观上…
本章将说明守护进程结构,以及如何编写守护进程程序. 守护进程,也就是通常说的Daemon进程,是Unix中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件. 编程规则 在编写守护进程程序时需遵循一些基本规则,以防止产生不必要的交互作用.下面将说明这些规则. 1.调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0) 2.调用fork,然后使父进程exit,保证了子进程不是进程组的组长进程,是下面进行setsid调用的先决条件 3…
一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是init进程,在自举(bootstrapping)过程结束时由内核调用.该进程的程序文件在UNIX的早期版本中是/etc/init,在较新版本中是/sbin/init.此进程负责在内核自举后启动一个UNIX系统.init通常读与系统有关的初始化(/etc/rc*文件),并将系统引导到一个状态(例如多用户).init进程决不会终止.它是…
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)…
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)…
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)…
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)…
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)…
umask函数为进程设置文件模式创建屏蔽字,并返回以前的值. #include <sys/stat.h> mode_t umask( mode_t cmask); 返回值:以前的文件模式创建屏蔽字 参数cmask是由S_IRUSR.S_IWUSR.S_IXUSR.S_IRGRP.S_IWGRP.S_IXG.S_IROTH.S_IWOTH及S_IXOTH这9个常量中的若干个按位“或”构成的. 在进程创建一个新文件或新目录时,就一定会使用文件模式创建屏蔽字. 程序实例: #include"…
apue第四章学习总结 4.1.若以stat函数去替换lstat函数,会发生: 原来的目录路径: $:~/workspace/apue2/include$ ls -l apue.h abc lrwxrwxrwx 1 mikedeng mikedeng 6 10月 25 18:33 abc -> apue.h -rw-r--r-- 1 mikedeng mikedeng 4736 5月 28 2005 apue.h 当执行程序时: $:~/workspace/apue2/include$ ./st…
第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. 2.void perror(const char *s) 该函数基于当前的errno值,在标准出错文件中输出一条出错消息,然后返回.声明在stdio.h文件中.它首先输出由s指向的字符串,然后是一个冒号,一个空格,接着是errno值对应的出错信息,最后是一个换行符. 第2章 UNIX标准化及实现…
本篇博文内容摘自<UNIX环境高级编程>(第二版),仅作个人学习记录所用.关于本书可参考:http://www.apuebook.com/. umask函数为进程设置文件模式创建屏蔽字,并返回以前的值.(这是少数几个没有出错返回函数中的一个.) #include <sys/stat.h> mode_t umask( mode_t cmask); 返回值:以前的文件模式创建屏蔽字 其中,参数cmask是由S_IRUSR.S_IWUSR.S_IXUSR.S_IRGRP.S_IWGRP.…
[lingyun@localhost umask_1]$ vim umask.c  + umask.c                                                                                                                    /*********************************************************************************…
1.文件信息结构体 struct stat{ mode_t st_mode; //file type and permissions ino_t st_ino; //i-node number (serial number) dev_t st_dev; //device number (file system) dev_t st_rdev; //device number for special files nlink_t st_nlink; //number of links uid_t st…