您的位置:首页 > 运维架构 > Linux

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* 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:从另一个进程发送的信号:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: