《APUE》第6章练习1】的更多相关文章

apue第七章学习总结 1.main函数 程序是如何执行有关的c程序的? C程序总是从main函数开始执行.main函数的原型是 int main(int argc,char *argv[]); 其中,argc是命令行参数的数目,argv是指向参数的各个指针所构成的数组. 当内核执行C程序时(使用一个exec函数),在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址--这是由连接编辑器设置的,而连接编辑器则由C编译器(通常是cc)调用.启动例程从内核取得命令…
apue第六章学习总结 1.关于阴影文件与口令 在口令文件当中,常见的字段有(以root为例): root(用户名):x(加密口令):0(uid):0(gid):root(注释字段):/root(用户所在根目录):/bin/bash(用户的shell所在目录) 注意:这里的加密口令只是一个占位符号,真正的加密口令存于阴影文件当中,阴影口令文件不应是一般用户可以读取的.仅有少数几个程序需要存取加密口令,例如login(1)和passwd(1),这些程序常常是设置用户ID为root的程序.用了阴影口…
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…
在给出用户登录名或数值用户ID后,这两个函数就能查看相关项. #include <sys/types.h> #include <pwd.h> struct passwd *getpwuid(uid_t uid); struct passwd *getpwnam(const char *name); 两个函数返回值:成功返回指针,出错返回NULLuid:需要获取信息的uid号 getpwuid例程 #include <pwd.h> #include <sys/typ…
伪终端是指对于一个应用程序而言,他看上去像一个终端,但事实上它并不是一个真正的终端. 进程打开伪终端设备,然后fork.子进程建立一个新的会话,打开一个相应的伪终端从设备.复制输入.输出和标准错误文件描述符,调用exec,子进程从设备编程伪终端. 伪终端能像终端一样,但是无意义的函数调用如改变波特率.发送中断符.设置奇偶校验将被忽略. 伪终端可以做输入和输出. posix_opent函数提供了一种可移植的方法来打开下一个可用伪终端主设备 #include <stdlib.h> #include…
终端I/O有两种不同的工作模式: (1)规范模式:输入以行单位进行处理,每个读请求也最多返回一行. (2)非规范模式:输入字符不装配成行. 终端设备是由通常位于内核中的终端驱动程序控制的.每个终端设备都有一个输入队列和一个输出队列. 如果打开了回显,输入队列和输出队列之间有一个隐含的连接 输入队列有一个MAX_INPUT的有限值 还有一个MAX_CANON,限制输入行的最大字节数 输出队列也是有限的,但是当它快要满的时候,内核会让它休眠,直到有可用空间 终端行规程(terminal line d…
4.1 用 stat 函数替换图 4-3 程序中的 lstat函数,如若命令行残数之一是符号链接,会发生什么变化? stat不支持链接,如果有参数是链接符号,会显示链接后的文件属性. 4.2 如果文件模式创建屏蔽字 777 (八进制),结果会怎样?用shell的umask命令验证该结果 pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ vim ex4-.c pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ .c pi@ras…
1. 文件描述符 打开或创建一个文件时,内核向进程返回一个文件描述符,当读.写一个文件时,用open()或creat()返回的文件描述符标识该文件,将其作为参数传递给write.read. stdin标准输入 fd = 0 stdout标准输出 fd = 1 stderr标准错误 fd = 2 ​ 为了可读性可以用 STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO宏来表示.这些宏在<unistd.h>中定义. ​ 文件描述符的变化范围 :0~OPEN_MAX-1…
4.2 文件函数 #include <sys/stat.h> int stat(const char *restrict pathname, struct stat *restrict buf ); int fstat(int fd, struct stat *buf ); int lstat(const char *restrict pathname, struct stat *restrict buf ); int fstatat(int fd, const char *restrict…
5.2流和file对象 #include <wchar.h> int fwide(FILE *fp, int mode); Returns: positive if stream is wide oriented,negative if stream is byte oriented,or 0 if stream has no orientation mode 负:字节定向,mode 正:宽字节定向, mode 0:不设置流定向但是返回流定向值 5.4缓冲 IO缓冲方式:全缓冲(缓冲区满存入磁…
unix domain socket 关闭socket并不会删除文件,重复bind会失败.所以在bind之前要unlink该文件. open服务器的实现只是简单地看了一下,大致上就是通过unix domain socket传递了打开的fd和相应的权限,而不是文件内容.数据通过sendmsg和recvmsg这两api来实现. 这样的好处,是打开的逻辑和客户端实现解耦,同时也屏蔽了一些细节(比如设备.文件等).相比库函数,这样的方式更便于更新. 然后是getopt这个函数的用法.这是写工具经常会用到…
intel 都是小端,小端即最低有效字节在最低地址上. tcp/ip协议栈使用大端字节序. connect失败可能是一瞬时的,用指数补偿算法处理,exponential backoff.但是在bsd套接字实现中,不能这么处理,connect失败,需要关闭套接字,重新打开,这样才是可移植的. 使用dup2来重定向fd. tcp面向连接,udp无连接. recvfrom可能会无限期阻塞. SOCK-DGRAM保证一次可以读取一条消息.而SOCK_STREAM可能需要读多次才行.…
每种信号都有名字,都是以SIG开头 信号机制最简单的接口是signal函数 #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 返回值:成功以前的信号处理配置,出错SIG_ERR kill函数将信号发送给进程或进程组.raise函数则允许进程向自身发送信号 #include <sys/types.h> #includ…
获取文件属性 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(const char *pathname, struct stat *buf); int fstat(int fd, struct stat *buf); int lstat(const char *pathname, struct stat *buf); #include <fcntl.h> #i…
9 - 进程关系 GitHub 地址 1. 进程组 每个进程除了有一个 进程 ID 外,还属于一个 进程组 .进程组是一个或多个进程的 集合 ,通常,它们是在同一作业中结合起来的,同一进程组中的各进程接受来自同一终端的各种信号.每一个进程组有一个唯一的 进程组 ID . 函数 getpgrp 返回调用进程的进程组 ID: #include <unistd.h> pid_t getpgrp(void); //返回值:调用此函数的进程的进程组ID 函数 getpgid 用于获取指定 \(pid\)…
1 - UNIX基础知识 Github 地址 1. 操作系统 可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.通常将这种软件称为 内核 (kernel) .( Linux 是 GNU 操作系统的内核 ) 内核 的接口是 系统调用 (system call) ,公用函数库 构建在系统调用之上,应用程序既可以调用公用函数库,也可以使用系统调用.shell 是一个特殊的应用程序,为运行其他应用程序提供了一个接口. 2. shell shell 是一个命令行解释器,它读取用户输入,然…
原文网址:http://www.cnblogs.com/fusae-blog/p/4256794.html APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. dup和dup2函数:用来复制文件描述符的 sync函数,fsync函数和fdatasync函数:大致的功能是将缓冲区的数据刷进队列中,等待写入到硬盘中. fcnti函数:可以改变已打开文件的性质. ioctl函数:控制设备. 习题: 1.当读/写磁盘文件时,本章中描述的函数是否有缓冲机制?请说明…
APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. dup和dup2函数:用来复制文件描述符的 sync函数,fsync函数和fdatasync函数:大致的功能是将缓冲区的数据刷进队列中,等待写入到硬盘中. fcnti函数:可以改变已打开文件的性质. ioctl函数:控制设备. 习题: 1.当读/写磁盘文件时,本章中描述的函数是否有缓冲机制?请说明原因. 答:是没有的.上述提到的函数是open,read,write等基于POSIX的函数,是直接调用内核中…
参考文章:http://blog.csdn.net/andyxie407/article/details/1672325 今天在运行在APUE第16章的16-14(客户端)和16-15(服务端)遇到了不少问题,搞了半天,运行方法多谢andyxie407的文章给了很好地参考(本来就一样,不叫参考),后面还是运行不出结果,结果找到了两个程序抄错了的地方(原谅我,有时候,看一眼大概实现就把代码敲上去了),写都写到这了,还是把我的痛苦运行结果展示一番,代码如下: //16-14.c 即客户端 #incl…
今天终于把APUE前17章全部看完了,基本上主要知识就在这些章节里. 之前看完<unix/linux编程实践教程>时,有一种豁然开朗.心旷神怡的感觉,在代码级别了解了linux很多系统机制,和一直不理解编程细节,而且对UNIX编程的整体知识结构有了很好的把握. APUE是公认的经典,事无巨细的把每个知识讲解很透,还有很多细心的提示.但是看起来的过程并不觉得那么美好,原因有以下几点: 1.译者那糟糕的水平!很多句子根本就不是中国人能说口的.无奈英语烂,顶多能看看man的水平,只能看中文版了.这本…
Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file descriptor(简称:fd,文件描述符). 系统调用是如何完成一个I/O操作的呢? linux将内存分为内核区,用户区: linux内核给我们管理所有的硬件资源,应用程序通过调用系统调用和内核交互,达到使用硬件资源的目的:应用程序通过系统调用read发起一个读操作:这时候内核创建一个文件描述符,并通过驱动…
前几天在看apue第16章关于socket的例子,就是一个非常典型的socket服务器,关键代码如下: void serve (int sockfd) { int ret; int clfd; int status; FILE *fp; pid_t pid; char buf[BUFLEN]; for (;;) { clfd = accept (sockfd, NULL, NULL); ) { syslog (LOG_ERR, "accept error: %d, %s", errno…
在看 apue 第 19 章伪终端第 6 节使用 pty 程序时,发现“检查长时间运行程序的输出”这一部分内容的实际运行结果,与书上所说有出入. 于是展开一番研究,最终发现是书上讲的有问题,现在摘出来让大家评评理. 先上代码 pty.c pty_fun.c 这是书上标准的 pty 程序,简单说起来就是提供一个伪终端给被调用程序使用,例如 pty prog arg1 arg2 相当于在新的伪终端上执行 prog arg1 arg2 从而可以避免一些直接执行 prog 带来的问题. 19.6 节重点…
apue 最后两章都是通过一个完整的实例来解释一些 linux 功能,第20章就是通过一个数据库实例来解释文件锁的使用, 说实话,当时没兴趣,因为满页都是源码和解析,有点看不下去.但是再拾起来硬着头皮看的时候,发现这哪里是个小 demo,明明是个五脏俱全的 key-value 数据库嘛, 而且这个数据库,提供多进程并发读写的安全性保证(通过文件锁).提供已删除节点循环再利用的能力.提供根据用户需求调节内部 hash 表参数的能力…… 特别是它的索引与数据文件格式,采用字符串存储各种偏移量与数字,…
fd = open("./newfile", O_RDWR|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR); ) { perror("open"); ; } pos = lseek(fd, , SEEK_CUR); printf("pos:%d\n",pos); wn = write(fd, ); ) { perror("write"); close(fd); ; } close(fd); ; 以上是ls…
最近在看APUE第10章中关于system函数的POSIX.1的实现.关于POSIX.1要求system函数忽略SIGINT和SIGQUIT,并且阻塞信号SIGCHLD的论述,理解得不是很透彻,本文就通过实际的实例来一探究竟吧. 一.为什么要阻塞SIGCHLD信号 #include <stdlib.h> int system(const char *command); 函数工作大致流程:system()函数先fork一个子进程,在这个子进程中调用/bin/sh -c来执行command指定的命…
0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.windows下环境搭建 3.java里连接redis数据库 4.关于认证 5.redis高级功能总结1.基础底层数据结构1.1.简单动态字符串SDS定义: ...47分钟前1 url :http://blog.csdn.net/youyou1543724847/article/details/52818…
在阅读APUE信号一章时,我遇到Linux下对后台进程通过kill传递信号不起作用的问题 具体情形与如下链接中的老兄一致: http://bbs.csdn.net/topics/390335913?page=1#post-395188120 编译执行下面的信号程序,然后再shell命令行:先让程序在后台运行,得到进程ID,然后用kill向该进程发送信号:kill -USR1 ID,但是没有结果 #include "apue.h" static void sig_usr(int); in…
在之前的树莓派网关项目中遇到了这样一个问题,由于要把网关写的Server持续运行,尤其是要加电自动开启.发现ssh登录开启服务程序之后,当把pty退出时Server端自动断开了,这里想到的APUE中第九章的内容,回顾了下关于会话首进程,进程组,控制终端的概念,所以我们需要把自己写的Server端变为父进程为init(1)的守护进程. --->首先想到的办法是使用nohup命令,这里遇到一个坑: 当我们用nohup去处理shell脚本时是没有问题的,但是在尝试执行一个Python脚本时: nohu…
随着你对编程的深入,多线程是一个免不了的话题,在这里就对多线程做一个比较详细的总结. 首先摆在我们面前的就是什么是线程,以及为么会有这个东西.记得之前学习的时候自己会画一张很大的图,在图中可以详细的写出线程为什么会出现?他是为了解决什么问题才出现的?线程的出项肯定是针对进程的,那就看看它针对进程的那些特性进行了改进吧: 1. 通过每种任务的类型,将各种任务分配给单独的线程,每个线程在处理任务的时候可以采用同步编程的方式 2. 所有的线程都可以访问同一进程内的全局变量/文件描述符/heap mem…