Unix/Linux编程实践教程(0:文件、终端、信号)
2016-09-23 18:26
190 查看
本来只打算读这本书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数组。
系统调用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代码:
列出这段代码,除了要注意递归外,就是要留意几个结构体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:从另一个进程发送的信号:
阅读联机帮助的一个示例:
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[][4] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; static const char mon_name[][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; static char result[26]; 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, 1900 + 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 0; } 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(1); } while((direntp=readdir(dir_ptr))!=NULL) { if(direntp->d_ino==inode_to_find) { strncpy(namebuf,direntp->d_name,buflen); name[buflen-1]='\0'; closedir(dir_ptr); return; } } fprintf(stderr,"error looking for inum %d\n",inode_to_find); exit(1); } ino_t get_inode(char *fname) { struct stat info; if(stat(fname,&info)==-1){ fprintf(stderr,"Cannot stat "); perror(fname); exit(1); } 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:从另一个进程发送的信号:
相关文章推荐
- Linux命令(30):isof
- CentOS vsftp 553 Could not create file 错误解决
- Linux命令(29):free
- 使用Eclipse编译运行MapReduce程序 Hadoop2.6.0_Ubuntu/CentOS
- centos6.5和centos7修改系统字符集
- git .ssh 公钥
- Linux 挂载硬盘
- 解决从linux本地文件系统上传文件到HDFS时的权限问题
- linux 全新的备份神器 Duplicity
- crontab不运行问题
- Linux 查看服务器配置
- FastDFS5.05 linux 集群部署详细安装教程
- Linux LVM分区管理、扩展
- centos6安装mysql5.6
- Linux设备驱动模型-Ktype
- Linux 命令行快捷键
- linux下设置mysql数据库字符集utf8
- Ubuntu修改apt源
- Mirantis OpenStack 6.0 base on CentOS 6.5 Install Doc
- Hydra源码分析学习