Unix/Linux编程实践教程(0:文件、终端、信号)

   2023-02-10 学习力0
核心提示:本来只打算读这本书socket等相关内容,但书写得实在好,还是决定把其余的内容都读一下。 阅读联机帮助的一个示例: open系统调用:read系统调用:Unix的time:上面的printf可以看到,一个临时的char* 指针也可以+4,希望查看ctime函数里面是否有malloc,如

本来只打算读这本书socket等相关内容,但书写得实在好,还是决定把其余的内容都读一下。

 

阅读联机帮助的一个示例:

Unix/Linux编程实践教程(0:文件、终端、信号)

 

open系统调用:

Unix/Linux编程实践教程(0:文件、终端、信号)

read系统调用:

Unix/Linux编程实践教程(0:文件、终端、信号)

Unix的time:

Unix/Linux编程实践教程(0:文件、终端、信号)

Unix/Linux编程实践教程(0:文件、终端、信号)

Unix/Linux编程实践教程(0:文件、终端、信号)

上面的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改变打开文件位置:

Unix/Linux编程实践教程(0:文件、终端、信号)

 

处理系统调用中的错误

确定错误种类errno。

显示错误信息perror:

Unix/Linux编程实践教程(0:文件、终端、信号)

ls -a选项列出隐藏文件:

Unix/Linux编程实践教程(0:文件、终端、信号)

怎么打开目录:

Unix/Linux编程实践教程(0:文件、终端、信号)

 

如何编写ls:

Unix/Linux编程实践教程(0:文件、终端、信号)

stat获取文件属性信息:

Unix/Linux编程实践教程(0:文件、终端、信号)

其中stat的结构为:

Unix/Linux编程实践教程(0:文件、终端、信号)

 

将模式字段转换为字符

Unix/Linux编程实践教程(0:文件、终端、信号)

使用掩码得到文件类型:

Unix/Linux编程实践教程(0:文件、终端、信号)

 set-user-ID允许用户修改密码:

Unix/Linux编程实践教程(0:文件、终端、信号)

Unix/Linux编程实践教程(0:文件、终端、信号)

sticky位:

Unix/Linux编程实践教程(0:文件、终端、信号)

修改最后修改时间和最后访问时间:

Unix/Linux编程实践教程(0:文件、终端、信号)

Unix/Linux编程实践教程(0:文件、终端、信号)

创建一个新文件的主要四个操作:

Unix/Linux编程实践教程(0:文件、终端、信号)

 

目录的工作过程:

 Unix/Linux编程实践教程(0:文件、终端、信号)

mkdir、rmdir、rm(unlink)。unlink不能用来删除目录。

命令ln使用系统调用link:

Unix/Linux编程实践教程(0:文件、终端、信号)

mv命令有时候调用rename:

Unix/Linux编程实践教程(0:文件、终端、信号)

rename的逻辑:

Unix/Linux编程实践教程(0:文件、终端、信号)

cd命令使用系统调用chdir:

Unix/Linux编程实践教程(0:文件、终端、信号)

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 direntstruct 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部分目录里运行时不能成功,不知道跟文件系统、挂载有没有关系。

 

硬连接和符号连接:

Unix/Linux编程实践教程(0:文件、终端、信号)

 系统调用fcntl控制文件描述符:

Unix/Linux编程实践教程(0:文件、终端、信号)

 stty命令的相关参数及使用:

Unix/Linux编程实践教程(0:文件、终端、信号)

Unix/Linux编程实践教程(0:文件、终端、信号)

Unix/Linux编程实践教程(0:文件、终端、信号)

其中,termios结构类型:

Unix/Linux编程实践教程(0:文件、终端、信号)

设备文件的系统调用ioctl

Unix/Linux编程实践教程(0:文件、终端、信号)

 

Ctrl+C是如何工作的:

Unix/Linux编程实践教程(0:文件、终端、信号)

 

信号 

生成信号的请求来自3个地方:

Unix/Linux编程实践教程(0:文件、终端、信号)

常见信号类型:

Unix/Linux编程实践教程(0:文件、终端、信号)

signal信号处理函数:

Unix/Linux编程实践教程(0:文件、终端、信号)

 基本curses函数:
Unix/Linux编程实践教程(0:文件、终端、信号)

 Unix/Linux编程实践教程(0:文件、终端、信号)

 

进程设置闹钟后挂起:

Unix/Linux编程实践教程(0:文件、终端、信号)

Unix的3种时间:

Unix/Linux编程实践教程(0:文件、终端、信号)

计时器的struct itimerval结构:

Unix/Linux编程实践教程(0:文件、终端、信号)

计时器的实现原理:

Unix/Linux编程实践教程(0:文件、终端、信号)

系统调用getitimer和setitimer:

Unix/Linux编程实践教程(0:文件、终端、信号)

 

处理多个信号:sigaction:

Unix/Linux编程实践教程(0:文件、终端、信号)


其中,sigaction结构体:

Unix/Linux编程实践教程(0:文件、终端、信号)

sigaction的用法示例:

Unix/Linux编程实践教程(0:文件、终端、信号)

阻塞信号系统调用sigprocmask:

Unix/Linux编程实践教程(0:文件、终端、信号)

暂时阻塞信号示例:

Unix/Linux编程实践教程(0:文件、终端、信号)

 

kill:从另一个进程发送的信号:

Unix/Linux编程实践教程(0:文件、终端、信号)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 【强转】QEMU+GDB调试linux内核全过程
    【强转】QEMU+GDB调试linux内核全过程
    昨天更新了一篇名为《QEMU+GDB调试linux内核全过程》[link][https://blog.csdn.net/weixin_37867857/article/details/88138432]的博客,发现排版比较混乱,而且思维也比较混乱。咋一看下来简直是惨不忍睹,而且会给读者在安装过程中一种云里雾里的感觉,加上
    03-08
  • Linux下Bochs,NASM安装和使用 linux bom
    Linux下Bochs,NASM安装和使用 linux bom
    以Ubuntu为例,先更新一下:sudo apt-get updatesudo apt-get upgrade然后安装Bochs环境:sudo apt-get install build-essential xorg-dev libgtk2.0-dev安装NASMNASM官网下载,这以nasm-2.14.02.tar.gz为例:用tar zxvf nasm-2.14.02.tar.gz解压后编译安装cd
    03-08
  • 把玩Alpine linux(一):安装
    把玩Alpine linux(一):安装
    导读Alpine Linux是一个面向安全应用的轻量级Linux发行版。它采用了musl libc和busybox以减小系统的体积和运行时资源消耗,同时还提供了自己的包管理工具apk。Alpine 的内核都打了grsecurity/PaX补丁,并且所有的程序都编译为Position Independent Executabl
    03-08
  • 日志审计与分析实验三(rsyslog服务器端和客户端配置)(Linux日志收集)
    日志审计与分析实验三(rsyslog服务器端和客户
     Linux日志收集一、实验目的:1、掌握rsyslog配置方法2、配置rsyslog服务收集其他Linux服务器日志:C/S架构:客户端将其日志上传到服务器端,通过对服务器端日志的查询,来实现对其他客户端的日志进行集中管理;下面实现就是通过两套机器来实现,(server:19
    03-08
  • Linux学习系列--如何在Linux中进行文件的管理
    Linux学习系列--如何在Linux中进行文件的管理
    文件在常见的Linux的文件系统中,经常使用能了解到的文件管理系统是分为多个文件夹进行管理的。如何查看文件路径 pwd ,在文件目录中,会有一个点(.)代表的是当前目录,两个点(..)代表的是当前目录的上层目录在Linux下,所有以点开始的文件都是“隐藏文件
    03-08
  • [JetBrains] 我想在 Linux 上使用 macOS 键绑定!
    [JetBrains] 我想在 Linux 上使用 macOS 键绑定
    很高兴认识你,我的名字是kitakkun。我最近开始实习,是工程界的新手。顺便说一句,这是我的第一篇文章。你最喜欢的操作系统是什么?视窗?苹果系统?还是Linux?我将它们全部用于不同的目的,但感觉就像 macOS ≒ LinuxWindows。一两个月前,我最喜欢 Linux
    03-08
  • linux 配置Socks51
    linux 配置Socks51
    ***大家耳熟能详,但是socks用到的人比较少,那什么是socks呢?请看第二段或者百度百科,socks分别有4和5两个版本,现在5为主流。工作中经常用***访问国外,但是同时国内的速度又慢了,让人很纠结,实际上这个时候可以考虑使用socks。指定某一个程序使用国外s
    02-10
  • linux下如何单独编译设备树? linux设备树是什
    答: make vendor/device_name.dtb  如: make freescale/fsl-1043a-rdb.dtb
    02-10
  • linux下mysql开启远程访问权限及防火墙开放3306端口
    linux下mysql开启远程访问权限及防火墙开放3306
    开启mysql的远程访问权限默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限。主流的有两种方法,改表法和授权法。相对而言,改表法比较容易一点,个人也是比较倾向于使用这种方法,因此,这
    02-10
  • 移植linux3.7到nuc900系列开发板遇到的问题
    通过移植学习linux新版本内核,大概了解一下内核变化。记录一下移植过程中遇到的问题或值得注意的地方。1,添加一款arm9芯片的支持首先修改\arch\arm\tools\mach-types文件添加一行w90p950evbMACH_W90P950EVBW90P950EVB同目录下的脚本文件在编译内核时会根据
    02-10
点击排行