Unix/Linux编程实践教程(0:文件、终端、信号)
本来只打算读这本书socket等相关内容,但书写得实在好,还是决定把其余的内容都读一下。
阅读联机帮助的一个示例:
open系统调用:
read系统调用:
Unix的time:
上面的printf可以看到,一个临时的char* 指针也可以+4,希望查看ctime函数里面是否有malloc,如果有的话由谁来释放内存???没有的话为什么可以指针操作。
为解决上述疑惑,通过查看http://www.cplusplus.com/reference/ctime/ctime/以及及http://www.cplusplus.com/reference/ctime/asctime/,得到:
ctime
char* ctime (const time_t * timer);
Convert time_t value to string This function is equivalent to: asctime(localtime(timer)) asctime
char* asctime (const struct tm * timeptr);
Convert tm structure to string It is defined with a behavior equivalent to: char* asctime(const struct tm *timeptr)
{
static const char wday_name[][] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
static const char mon_name[][] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
static char result[];
sprintf(result, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n",
wday_name[timeptr->tm_wday],
mon_name[timeptr->tm_mon],
timeptr->tm_mday, timeptr->tm_hour,
timeptr->tm_min, timeptr->tm_sec,
+ timeptr->tm_year);
return result;
}
疑惑解除了,可以看到ctime返回的是一个静态局部char数组。
系统调用lseek改变打开文件位置:
处理系统调用中的错误
确定错误种类errno。
显示错误信息perror:
ls -a选项列出隐藏文件:
怎么打开目录:
如何编写ls:
stat获取文件属性信息:
其中stat的结构为:
将模式字段转换为字符
使用掩码得到文件类型:
set-user-ID允许用户修改密码:
sticky位:
修改最后修改时间和最后访问时间:
创建一个新文件的主要四个操作:
目录的工作过程:
mkdir、rmdir、rm(unlink)。unlink不能用来删除目录。
命令ln使用系统调用link:
mv命令有时候调用rename:
rename的逻辑:
cd命令使用系统调用chdir:
spwd.c代码:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<dirent.h> ino_t get_inode(char*);
void printpathto(ino_t);
void inum_to_name(ino_t,char *,int); int main()
{
printpathto(get_inode".");
putchar('\n');
return ;
} void printpathto(ino_t this_inode)
{
ino_t my_inode;
char its_name[BUFSIZ];
if(get_inode("..")!=this_inode)
{
chdir("..");
inum_to_name(this_inode,its_name,BUFSIZ);
my_inode=get_inode(".");
printpathto(my_inode);//注意这两行,是怎么实现递归,然后按照正确顺序打印目录的
printf("/%s",its_name);
}
} void inum_to_name(ino_t inode_to_find,char *namebuf,int buflen)
{
DIR *dir_ptr;
struct dirent *direntp;
dir_ptr=open(".");
if(dir_ptr==NULL){
perror(".");
exit();
} while((direntp=readdir(dir_ptr))!=NULL)
{
if(direntp->d_ino==inode_to_find)
{
strncpy(namebuf,direntp->d_name,buflen);
name[buflen-]='\0';
closedir(dir_ptr);
return;
}
}
fprintf(stderr,"error looking for inum %d\n",inode_to_find);
exit();
} ino_t get_inode(char *fname)
{
struct stat info;
if(stat(fname,&info)==-){
fprintf(stderr,"Cannot stat ");
perror(fname);
exit();
}
return info.st_ino; }
列出这段代码,除了要注意递归外,就是要留意几个结构体DIR 、struct dirent 、struct stat以及它们的使用方法,可以参考收藏“Linux下DIR,dirent,stat等结构体详解”:http://www.liweifan.com/2012/05/13/linux-system-function-files-operation/
在上面的代码中,对while((direntp=readdir(dir_ptr))!=NULL)是怎么遍历目录中文件的,还不是很清楚,必要的时候再去读一下readdir的源码。可能DIR结构体中包含一个当前已读取目录的记录吧?可能跟MFC里面的FindNextFile函数差不多。
这个spwd程序似乎在挂载的vtid部分目录里运行时不能成功,不知道跟文件系统、挂载有没有关系。
硬连接和符号连接:
系统调用fcntl控制文件描述符:
stty命令的相关参数及使用:
其中,termios结构类型:
设备文件的系统调用ioctl:
Ctrl+C是如何工作的:
信号
生成信号的请求来自3个地方:
常见信号类型:
signal信号处理函数:
基本curses函数:
进程设置闹钟后挂起:
Unix的3种时间:
计时器的struct itimerval结构:
计时器的实现原理:
系统调用getitimer和setitimer:
处理多个信号:sigaction:
其中,sigaction结构体:
sigaction的用法示例:
阻塞信号系统调用sigprocmask:
暂时阻塞信号示例:
kill:从另一个进程发送的信号:
Unix/Linux编程实践教程(0:文件、终端、信号)的更多相关文章
- 学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
0.目录 1.概念 2.系统资源 3.学习方法 4.从用户的角度来理解 Unix 4.1 登录--运行程序--注销 4.2 目录操作 4.3 文件操作 5.从系统的角度来理解 Unix 5.1 网络桥 ...
- Unix/Linux编程实践教程(二:socket、多线程、进程间通信)
同一接口不同的数据源: 协同进程: fdopen以文件描述符为参数: fopen和popen: 为了实现popen,必须在子进程中调用sh,因为只有shell本身即/bin/sh可以运行任意shell ...
- Unix/Linux编程实践教程(一:进程、管道)
execvp在程序中启动新程序: 用fork创建新进程: forkdemo2代码: 测试fork的时候参考<Linux权威指南>阅读笔记(3) 使用了patch: [root@local ...
- 学习《Unix/Linux编程实践教程》(2):实现 more
0.目录 1.more 能做什么? 2.more 是如何实现的? 3.实现 more 3.1 more01.c 3.2 more02.c 3.3 more03.c 1.more 能做什么? more ...
- Unix/Linux编程实践教程(三:代码、测试)
测试logfilec.c的时候,有个sendto(sock,msg,strlen(msg),0,&addr,addrlen),编译时提示: logfilec.c:30: warning: pa ...
- 利用lsof去查看Unix/Linux进程打开了哪些文件
利用lsof去查看Unix/Linux进程打开了哪些文件 今天用了一下lsof,发现这个linux的小工具,功能非常强大而且好用. 我们可以方便的用它查看应用程序进程打开了哪些文件或者对于特定的一个文 ...
- Unix Linux 编程书籍
UNIX环境高级编程(第3版) Advanced Programming in the UNIX Environment Linux/UNIX系统编程手册 Linux/UNIX系统编程手册 (豆瓣) ...
- Linux下more命令C语言实现实践 (Unix-Linux编程实践教程)
1. more第一版 实现基础功能,显示每一页固定24行文本,“q Enter”退出, “Enter” 下一行, “space Enter”下一页. #include<stdio.h> # ...
- linux编程实践:实现pwd命令
内核为每个目录都设置了一个指向自己的i节点入口,即".",还有一个指向其父目录i节点的入口,即"..",我们首先获取当前目录的i节点编号,但是并不能知道当前目录 ...
随机推荐
- JS验证只允许输入数字
1.文本框只能输入数字代码(小数点也不能输入)<input onkeyup="this.value=this.value.replace(/\D/g,'')" onafter ...
- Web前端开发基础 第四课(CSS一些性质)
继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码:如某种颜色应用于p标签,这个颜色设置不仅应用p标签 ...
- IOS第12天(4,作业弹出键盘上加上(xib)view的处理,时间选择,代理模式使用,键盘的监听 )
*****HMViewController.m #import "HMViewController.h" #import "HMKeyboardTool.h" ...
- 同时使用python2和Python3
问题:thrift生成的是python2代码,之前使用的是Python3因此需要同时使用两个版本. 方案:将python3的可执行文件重命名为python3(默认为Python),这样使用pyhton ...
- Codeforces Round #346 (Div. 2) E F
因为很久没有个人认真做题了 昨天晚上开了场虚拟cf来锻炼个人手速 选的是第一次做cf的场 那时候7出3还被hack...之后也没补题 这次做的时候顺便回忆了一下以前比赛的时候是怎么想的 发现经验还是很 ...
- centos yum 使用笔记
yum 参数说明yum -y # 表示自动选择 基本使用# yum -y install 包名(支持*) :自动选择y,全自动# yum install 包名(支持*) :手动选择y or n# yu ...
- 安装XDEBUG步骤及问题
echo PHPINFO(); 如果搜索中没找到XDEBUG, 则表示没安装XDEBUG; XDEBUG官方下载路径, https://xdebug.org/download.php 查看环境参数 我 ...
- json转换对象 对象属性首字母为大写会出错 可以用以下方法
package open_exe; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import net.sf.json.u ...
- 有趣的BAT
最近某个用到的第三方程序会产生很多日志文件在logs目录中,每天一个log文件,类似 2014-05-07001.log.日积月累这个目录文件数量非常多,手动清除还是比较麻烦的. 由于这个软件不是自己 ...
- Array与ArrayBuffer
一.概述 二:Array使用 1.建立方式三种(数组里可以有不同的数据类型) 2.Array的简单使用 三:ArrayBuffer的简单使用 1.ArrayBuffer建立 导包 2.添加元素(+=) ...