UNIX 环境高级编程之我见

2023-05-16

《UNIX环境高级编程》(第二版)(人民邮电出版社)

【美】W.Richard Stevens& Stephen A.Rago 著

本书的主要结构分为以下几个部分:

(1).第1章UNIX基础知识

①UNIX体系结构中,最主要的是内核,它有一些称为系统调用的接口与外界交互。在内核之上有shell 和库函数,然后是应用软件。

②常见的shell有Bourneshell(sh), Bourne_again shell(bash), C shell(csh), Korn shell(ksh), TENEX Cshell(tcsh)。

③不能出现在文件名中的字符只有斜线(/)和空操作符(null)两个。

④文件描述符(file descriptor)通常是一个小的非负整数。

⑤当一个进程收到一个信号时,有三种选择:忽略该信号;按系统默认方式处理;提供一个函数,信号发生时调用这个函数。


(2) 第1章UNIX标准及其实现


1、本章介绍了三个主要标准:ISO C、POSIX和SingleUNIX Specification 。POSIX标准中的都只是接口,而不是实现,所以不区分系统调用和库函数,都称为函数。Single UNIX Specification(单一UNIX规范)是POSIX.1标准的一个超集,定义了一些附加的接口。

2、提高移植性的限制有两类:编译时限制和运行时限制。ISO C定义的限制都是编译时限制,列在头文件<limits.h>中。POSIX.1定义的限制和常量有5类:①不变的最小值;②不变值;③运行时可以增加的值;运行时不变的值(可能不确定);⑤路径名可变值(可能不确定)。

3、如果在编译一个程序时,希望它只使用POSIX的定义而不使用任何其他的定义,就需要定义常量_POSIX_C_SOURCE。


        (3)  文件I/O

1、UNIX系统中的大多数文件I/O只需用到5个函数:open、read、write、lseek以及close。由于新的open函数提供了O_CREAT和O_TRUNC选项,也就可以完全替代creat函数了。Lseek函数的作用就是为一个打开的文件设置其当前文件偏移量,定位读写的位置。

2、内核使用三种数据结构表示打开的文件:进程表中的一个记录项、文件表、v节点(在Linux中由通用型的i节点来实现)。

3、使用pread和pwrite函数可以实现原子读写。Dup和dup2函数可以复制一个现存的文件描述符。Sync、fsync和fdatasync函数可以使放在缓存中的数据写入磁盘,免得系统崩溃时造成数据丢失。Fcntl函数可以改变已打开文件的性质。

  (4) 文件和目录


1、本章讨论的中心是3个stat函数以及它们返回的信息。Stat函数返回文件的信息结构,fstat函数获取描述符为filedes的文件的有关信息,lstat可以返回符号链接的有关信息而不是它所指向的文件的有关信息。

2、其他函数:access函数按实际用户ID和实际组ID进行访问权限测试;umask函数为进程设置文件模式创建屏蔽字;chmod和fchmod函数用于更改现有文件的访问权限;chown、fchown和lchown函数用于更改文件的用户ID和组ID;truncate和ftruncate函数把现有文件截短为参数length字节;link、unlink创建和删除一个指向现有文件的链接(硬链接);symlink函数创建一个符号链接;utime函数可以更改一个文件的访问和修改时间;chdir、fchdir函数可以更改当前工作目录;getcwd返回工作目录的绝对路径。

 


 (5) 标准I/O库

1、在UNIX系统中,标准I/O库最终都要调用第3章中说明的I/O例程。

2、当用标准I/O库打开或创建一个一个文件时,我们已使一个流与一个文件相关联。每个标准I/O流都有一个与其相关联的文件描述符,可以对一个流调用fileno函数以获取其描述符。

3、对一个进程预定义了3个流:标准输入、标准输出和标准出错。

4、打开标准I/O流的函数:fopen、freopen、fdopen。用fclose函数关闭。

5、流的读写函数:getc、putc,fgetc、fputc,getchar、putchar,fgets、fputs,gets、puts(这一对不推荐使用)。

6、格式化输入输出函数:printf、scanf,fprintf、fscanf,sprintf、snprintf、sscanf。

7、使用tmpnam和tmpfile函数可以创建临时文件。

 

(6 )系统数据文件和信息


1、一般情况下,对于每个数据文件至少有三个函数:get函数,读出记录;set函数,打开文件然后反绕它;end函数,关闭文件。

2、与用户ID相关的几个重要的文件是:口令文件(passwd);阴影口令文件(shadow);组文件(group);utmp文件,记录当前登录进系统的各个用户;wtmp文件,跟踪各个登录和注销事件。

3、关于时间和日期的一个函数。Time函数返回当前时间:自1970年1月1日零时以来的秒数,而且是国际标准时间。Gettimeofday函数与time类似,只是可以提供更高的分辨率(微秒)。Localtime和gmtime函数将日历时间转换成以年、月、日、时、分、秒周日表示的时间,填充structtm结构。而mktime函数则相反,转换成time_t值,也就是日历时间。Asctime和ctime函数产生26字节的字符串,表示年月日时分秒等信息。Strftime函数提供格式化的时间表示,类似于printf程环境��f-�L�Ntuation'


(7 ) 进程环境


1、进程的正常终止大多是调用exit函数,它先调用各终止处理程序(由atexit函数登记),然后按需多次调用fclose关闭打开的所有流。

2、一个C程序的组成部分:正文段(指令)、初始化数据段、非初始化数据段(bss)、栈(函数调用时使用)、堆(动态存储分配)。

3、存储空间的动态分配函数有3个:malloc、calloc、realloc。而free函数释放存储空间。

4、系统中的环境变量由各个应用程序解释使用,内核不过问。相关的3个函数,putenv添加一个环境变量、setenv更改一个环境变量、unsetenv删除一个环境变量。

5、在C中,goto语句是不能跨越函数的,而执行这类跳转功能的是函数setjmp和longjmp 。

6、使用getrlimit和setrlimit函数查询和修改系统对一个进程的资源限制。

 


(8 ) 进程控制


1、每一个进程都有一个非负整型表示的唯一进程ID。这是最重要的一个进程标识符。

2、本章的重点fork。一个现有进程可以调用fork函数创建一个新进程。有两种用法:一个父进程希望复制自己,使父、子进程同时执行不同的代码段;一个进程想启动一个完全不一样的进程(例如利用shell执行命令)。Fork调用一次返回两次,在子进程中返回0,在父进程中返回子进程的ID。

3、vfork用于创建一个新进程,但其目的是exec一个新程序。就像fork的第二种用法。但是vfork保证子进程先运行。而对于fork,子进程还是父进程先运行是不确定的。

4、对于一个进程的任意一种终止情形,我们都希望被终止的进程能够通知其父进程它是如何终止的。终止函数exit、_exit和_Exit把进程的退出状态作为参数传递给函数。

5、调用wait和waitpid函数可以等待子进程终止的异步信号的通知。但是一个子进程终止之前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。

6、exec函数族。调用exec函数不创建新的进程,前后进程ID并不改变,它只是用一个全新的程序替换了当前进程的正文、数据、堆和栈。一共有6个函数:execl、execv、execle、execve、execlp和execvp。Exec函数的一种变体:解释器文件。Shell脚本是其中比较常见的一种。

 

(9) 进程关系



    1、本章最重要的是三个概念:进程组、会话和作业控制。进程组是一个或多个进程的集合,拥有一个唯一的ID,有一个组长进程。进程可以通过调用setpgid来加入一个现有的组或者创建一个新进程组。而会话是一个或多个进程组的集合,进程调用setsid函数建立一个新会话。作业控制允许在一个终端上启动多个作业(进程组),它控制哪一个作业可以访问终端,哪些作业在后台运行。

 

(10 ) 信号

1、这一章是相当重要的一章,用了50多页来讲解。含有大量的实例程序,讲解得比较深入。

2、信号是软件中断,用于处理异步事件。每一个信号都有一个名字,而且都以三个字符SIG开头,对应一个整型编号。信号产生的情况:①用户按下某些终端按键;②硬件异常;③调用kill函数发送;④用户使用kill命令发送;⑤检测到某种软件条件已经发生。三种信号处理方法:①忽略它;②捕捉它,然后调用特定的用户函数;③执行系统默认动作。

3、一些与信号有关的重要的函数。Signal函数用于设置某信号的处理程序,在很多平台该函数都是由sigaction函数来实现的。Kill函数将信号发送给进程或进程组。Alarm函数设置过一段时间后发送信号给自己,而pause函数使自己挂起直到捕捉到一个信号。Sigprocmask函数可以检测或更改其信号屏蔽字。Sigpending函数返回对应进程是阻塞的信号集。Sigsuspend函数解除一个阻塞信号并且马上使进程休眠,两步是一个原子操作。Abort函数用于使异常程序终止,进程接收到信号后终止之前可以执行一些必须的清理工作。

 

(11) 线程


1、这一章有三部分的内容,线程的概念、线程的创建和终止、线程的同步。

2、多线程设计的好处:①使得处理异步事件的代码变得简化。②共享方便。③提高整个程序的吞吐量。④改善交互程序的响应时间。

3、线程包含了表示进程内执行环境必需的信息,包括线程ID(只在它所属的进程环境中有效)、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据。

4、线程的创建使用pthread_create函数。但是创建后不保证哪一个线程先运行。如果进程中的任一线程调用了exit、_Exit或者_exit,那么整个进程就会终止。而单个线程有三种方式推出:①从启动例程中返回。②被同一进程中的其他线程取消。③自己调用pthread_exit函数。

5、实现线程同步主要有三种方式:使用互斥量、使用读写锁、使用条件变量。

 

(12) 线程控制



1、线程属性存放于数据结构pthread_attr_r中。可以使用函数pthread_attr_init函数来初始化这个数据结构,使用pthread_attr_destroy函数来用无效数值填充,即“反初始化”。使用函数pthread_attr_setdetachstate函数修改结构中的detachstate属性,可以让线程以分离状态启动。线程的栈属性通过pthread_attr_setstack函数来设置。

2、线程的同步属性包括互斥量属性、读写锁属性、条件变量属性。它们都有对应的进出共享属性,存在于不同的数据结构中。

3、如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是线程安全的。如果函数对异步信号处理程序的重入是安全的,那么就说函数是异步-信号安全的。

4、另外是线程属性还有可取消状态和可取消类型。这两个属性影响着线程在响应pthread_cancle函数调用时所呈现的行为。

 

(13) 守护进程

1、守护进程也称精灵进程(daemon)。

2、守护进程编程规则:①调用umask将文件模式创建屏蔽字设置为0。②调用fork,然后使父进程退出。③调用setsid以创建一个新会话。④将当前工作目录更改为根目录。⑤关闭不再需要的文件描述符。

3、守护进程没有控制终端,它的出错信息通过syslog设施来记录。对应的函数有openlog、syslog、closelog、setlogmask。

 

(14) 高级I/O


1、非阻塞I/O使得当我们使用open、read、write这样的操作时,如果不能完成则立即出错返回,不会阻塞。

2、记录锁对一个文件区域进行加锁,当一个进程正在对一个文件的某区域进行操作时可以阻止被另外一个进程对其的操作而引起的混乱。注意,这不是对整个文件加锁,只是一个文件的指定区域,所以这个锁也叫字节范围锁。

3、当一个进程需要请求多个描述符时,可以使用I/O多路转接技术来处理。大致是先构造一张有关描述符的表,然后调用一个函数,直到这些描述符中的一个准备好进行I/O时,该函数才返回。可以选择的函数有三个:poll、pselect和select。

4、高级I/O还提供了一些很有用的扩展函数。Readv和writev函数实现在一次函数调用中读、写多个非连续区域。Readn和writen函数可以指定读、写N个字节的数据,能够自动处理返回值小于要求值的情况,是多次调用read和write函数实现的。

 


(15) 进程间通信


1、最古老的IPC是管道,它有两方面的局限性:半双工传输(有个别系统实现了全双工);只能在有公共祖先的进程间使用。一些相关函数:pipe函数用于创建一个新管道,popen函数实现创建一个管道然后调用fork产生一个子进程,然后使用管道与其通信。

2、当一个程序产生某个过滤程序的输入,同时又读取该过滤程序的输出时,则该过滤程序就称为协同进程。

3、FIFO有时被称为命名管道。一些相关函数:mkfifo用于创建,使用open函数打开。

4、有三种IPC统称为XSI IPC,分别是消息队列、信号量(其实它真正上是一种同步原语)、共享存储器。每一个XSI IPC结构都有对应的一个非负整型标识符和一个键。三种的创建函数分别为msgget、semget、shmget。

 


(16 )网络IPC:套接字


1、套接字是通信端点的抽象,访问套接字要用套接字描述符。创建一个套接字使用socket函数。使用函数shutdown可以禁用一个套接字,通过参数决定关闭写端或者读端。

2、套接字使用的地址有一个通用的结构:socketaddr结构。使用函数bind可以将地址绑定到一个套接字,而调用函数getsocketname查看绑定到一个套接字的地址。

3、使用函数connect建立一个连接。对于服务器,可以调用listen函数来宣告可以接受连接请求,然后使用函数accept函数获得连接请求并建立连接。

4、六个数据传送相关的函数。Send和sendto函数很相似,都是把数据发出去,只是sendto允许在无连接的套接字上指定一个目标地址。而,sendmsg函数可以指定多重缓冲区传输数据,类似于writev函数。Recv函数用来接收数据,recvfrom函数比recv多一个功能是可以得到数据发送者的地址。对应于sendmsg,有recvmsg函数。

 

(17 ) 高级进程间通信

1、基于STREAMS的管道(简称STRREAMS管道,STREAMS pipe)是一个双向(全双工)管道。可以用fattach函数给STREAMS管道一个文件系统中的名字,使用fdetach函数撤销它。

2、UNIX域套接字用于在同一台机器上运行的进程之间的通信。提供流和数据报两种接口。使用socketpair函数可以创建一对非命名的、相互连接的UNIX域套接字。

 

(18) 终端I/O


1、终端设备是由位于内核中的终端驱动程序控制的,都有一个输入队列和输出队列。终端设备的所有特性都包含在termios结构中,该结构有四大标志:c_cflag, c_lflag,c_iflag, c_oflag。使用函数tcgetattr和tcsetattr可以获得和设置termios结构,而在命令行中可以使用stty命令。

2、终端I/O有两种不同的工作模式:规范模式输入处理(以行为单位处理)和非规范模式输入处理(不以行为单位处理输入数据)。

 

(19) 伪终端

1、伪终端这个术语暗示对于一个应用程序而言,它看上去像一个终端,但实际上应用程序被欺骗了。从内核角度看,伪终端看起来像一个双向管道。而事实上Solaris的伪终端就是用STREAMS构建的。

2、一些相关的调用函数。Posix_openpt函数用来打开下一个可用的伪终端主设备。用于更改权限的两个函数是grantpt和unlockpt。确定路径名用ptsname函数。

3、当我们用pty来执行另外一个程序时,该程序在一个它自己的会话中执行,并和一个伪终端连接。具体对伪终端的应用主要有以下几个。Utmp文件、作业控制交互、检查长时间运行程序的输出、script程序、运行协同进程、用非交互模式驱动交互式程序。

 

(20) 数据库函数库

1、本章详细介绍了一个数据库函数库的设计与实现。此函数库包括的一些函数有:数据库的打开与关闭函数:db_open, db_close;存储和删除一条记录:db_store,db_delete;从数据库获取一条记录:*db_fetch;访问数据库所有记录的两个函数:db_rewind, *db_nextrec。

2、数据库被建立时创建两个文件:索引文件和数据文件。索引文件的数据通常使用散列法或B+树来组织,从而提高数据的访问速度。对于进程对数据库数据的访问,有集中式和非集中式两种实现方法。集中式是指由一个数据库进程作为数据库管理者,所有的数据库访问工作由此进程完成,其它进程通过IPC与此中心进程联系。非集中式是指每个库函数独立申请并发控制,然后自己调用I/O函数。

 

(21)与网络打印机通信

    1、本章实现了两个程序:一个打印假脱机守护进程,用以将作业发送到打印机;一个命令行程序,用以将打印作业提交到假脱机守护进程。与网络打印机通信使用的是网络打印协议(IPP),而它建立在HTTP和TCP/IP的基础之上。



总结:这是一本经典的书,对于unix 程序员来说,本书一直遵循三个标准来进行编写。

(1). iso c ,ieee posix ,The single unix specification 这三个标准一直贯穿始终。

(2). 在某些方面还提到了 limit 这个概念,对于可移植性来说非常重要。

(3). 区分了标准io 和文件io 及其区别,及其文件描述符的重要性。

(4). 还有高级io 的4种方式(阻塞,非阻塞,select ,异步驱动模型)等好多有用的知识。

(5). linux中 七种的通信方式,无名管道,有名管道,信号,ipc(共享内存,消息队列,信号灯),还有 socket ,分别由unix ,贝尔实验室,伯克利分校实验室 继承而来的几套标准。

(6) . 讨论的伪终端 更是非常的透彻,主设备,从设备的关系,以及伪设备运行在从设备上的原理和用处,

(7). 本书还深刻讲解了 进程,线程 的一些同步机制,和互斥锁,类似pv 操作的东西。

(8). 本书给我最大的感受就是,纠正了好多的编程的习惯,错误的认识,提高了我的编程的视角和高度,全面的从系统出发,从全局出发,如 其linux pam 机制(http://www.chinaunix.net/old_jh/4/390136.html)查阅相关资料。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UNIX 环境高级编程之我见 的相关文章

  • 全文搜索引擎 ElasticSearch 还是 Solr?

    文章目录 什么是全文搜索为什么要用全文搜索搜索引擎Lucene xff0c Solr xff0c ElasticSearch xff1f LuceneSolrElasticSearch Elasticsearch vs Solr的选择历史比
  • 正面管教-读书笔记

    正面管教 读书笔记 文章目录 正面管教 读书笔记正面管教 价值正面管教 作者简介正面管教 正文一 什么是正面管教不同的教养方式是什么在起作用 xff1f 和善与坚定并行 二 为什么要使用正面管教一 阿德勒的基本概念二 赢得 孩子三 赢得合作
  • 内存数据库如何发挥内存优势?

    文章目录 指针式复用外键预关联序号定位集群维表备胎式容错回顾与总结SPL资料 与以磁盘存储为主的普通数据库相比 xff0c 内存数据库的数据访问速度可以高出几个数量级 xff0c 能大幅提高运算性能 xff0c 更适合高并发 低延时的业务场
  • git rm工作区文件删除后撤销

    文章目录 1 现象描述2 解决3 add了多余的文件需要从add中删除4 commit中撤销文件4 1 查看commit的内容4 2 撤销commit里的一部分内容 1 现象描述 今天add文件的时候 xff0c 不小心把一个不需要提交的也
  • 如何建立自己的认知体系

    文章目录 什么是以及为什么要搭建知识体系如何建立知识体系 什么是元认知 什么是程序类知识 什么是概念类知识 什么是事实类知识 搭建知识过程中的注意事项1 无用之用是为大用2 让知识间建立关系 xff0c 切记一定不要孤立3 寻找一切现象 x
  • 【springboot系列】springboot整合guava实现本地缓存

    概述 Guava Cache 是 Google 开源的一套开发工具集合 xff0c Guava Cache 是其中的一个专门用于处理本地缓存的轻量级框架 xff0c 是全内存方式的本地缓存 xff0c 而且是线程安全的 和 Concurre
  • 解决Windows莫名其妙地从休眠状态唤醒的问题

    因为经常写代码开很多个工作区 xff0c 电脑经常就是合盖休眠 xff0c 这样打开就能用 xff0c 但是总是在我不经意的时候发现电脑风扇在狂转 xff0c 不知道是哪个应用又在qj我的电源管理计划 xff0c 今天午休发现电脑风扇狂转
  • Ubunt装机后的必要设置及必备软件

    1 为 Ubuntu Dock 启用 Minimize on Click Ubuntu Dock xff08 位于屏幕左侧的任务栏 xff09 可以轻松打开 xff0c 并且切换和管理应用程序与正在运行的应用程序 你可以点击 Dock 中的
  • No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android 解决方法

    在ndk版本升级之后 xff0c 项目编译出现了问题 xff0c 提示没有对应的编译工具链 xff0c 目前最多的做法是 xff0c 下载之前的ndk版本 xff0c 然后再拷贝缺少的部分 这种做法确实可以解决问题 xff0c 但是既然新版
  • 来自一个前端大神转产品经理后的聊天感悟

    给的学习建议 xff1a 1 推荐给我一本书 锋利的jQuery 2 学会使用思维导图工具 3 课余时间学习理财 4 研发过程中 xff0c 多多留心一些交互 xff0c 自己完善反复琢磨自己的思路 xff08 保证是最简的 xff09 5
  • 08丨案例:编写最简单的性能脚本

    通常我们会遇到要手写脚本的时候 xff0c 就要针对一些接口编写脚本 这时候 xff0c 我们需要知道接口规范和后台的数据是什么 而有些性能测试工程师写脚本时 xff0c 并不知道后端的逻辑 xff0c 只知道实现脚本 xff0c 事实上
  • KindEditor图片上传相关问题 (转)

    size 61 x large 从众多的Web编辑器中选择KindEditor xff0c 主要是看重它的小巧 一个JS文件 两个CSS文件和一个GIF图片就是它的全部 所以在页面上的加载速度很快 xff0c 而且功能也相对齐全 目前Kin
  • hexo+Ubuntu+github搭建个人博客(详细)

    菜鸟初步搭建须知 xff08 是我没错 xff0c 备忘 xff09 相应知识 会一些基本的Linux命令和vim的操作命令 可以在实验楼上入门学习网上已经浏览了 官方文档安装ubuntu和git xff08 因为最近在学习用ubuntu
  • Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析

    前段时间 xff0c 公司同事开发了一个小工具 xff0c 在工具执行过程中 xff0c UI 界面一直处于卡死状态 通过阅读代码发现 xff0c 主要是由于 Dispatcher BeginInvoke 方法使用不当导致的 本文将通过一个
  • macos可以识别U盘但看不到U盘里的文件

    文章目录 1 问题描述2 解决 1 问题描述 以前U盘插上都可以直接操作的 xff0c 但是突然就不行了 可以看到 xff0c 我这个U盘是FAT32的格式网上有些说mac不可以直接读取fat32或者ntfs格式的文件 xff0c 或者说可
  • List的Clear方法与RemoveAll方法用法小结

    示例代码 using System using System Collections Generic namespace ListClearExp class Program static void Main string args Lis
  • 利用C#访问注册表获取软件的安装路径

    绝大多数软件 xff0c 基本上都会在注册表中记录自己的名字和安装路径信息 在注册表中记录这些信息的位置是 xff1a HKEY LOCAL MACHINE SOFTWARE Microsoft Windows CurrentVersion
  • 使用ValidationRule类来检查用户输入的有效性

    1 新建WPF应用程序ValidationRuleExp 整个程序的结构如下图所示 程序运行起来后的效果如下图所示 用户操作程序时 xff0c 先输入固话 手机 Email 个人网站等信息 xff0c 再点击右侧的 点我记住你 按钮 xff
  • 关闭窗体后,进程仍然在运行的问题重现与解决

    1 问题陈述 在开发中 xff0c 遇到这样一个问题 xff1a 点击程序主窗体右上角的叉号关闭应用程序后 xff0c 程序的进程却没有关闭 通过查阅资料 xff0c 了解到 xff0c 产生此类问题的原因主要有以下两点 xff1a 1 x
  • Python判断一个字符串是否包含子串的几种方法

    1 使用成员操作符 in span class hljs prompt gt gt gt span s 61 span class hljs string 39 nihao shijie 39 span span class hljs pr

随机推荐

  • easyui-datagrid获取行和列数据

    1 获取当前行 span class hljs keyword var span row 61 span class hljs string 39 dg 39 span datagrid span class hljs string 39
  • No plugin found for prefix ‘tomcat7’ in the current project and in the plugin groups

    idea中开发javaweb应用 xff0c 使用mvn tomcat7 run命令运行应用时 xff0c 需要配置tomcat的maven插件 在没有配置的情况下会出现下面的错误提示 ERROR No plugin found for p
  • C#中的IComparable和IComparer接口

    C 中 xff0c 自定义类型 xff0c 支持比较和排序 xff0c 需要实现IComparable接口 IComparable接口存在一个名为CompareTo 的方法 xff0c 接收类型为object的参数表示被比较对象 xff0c
  • C#接口汇总

    1 IComparable和IComparer接口 用于比较和排序 IComparable 可比较的 xff0c 实现该接口的类 xff0c 便具有 可比较的 特性 IComparer 比较器 xff0c 实现该接口的类 xff0c 是一个
  • Python操作环境变量

    1 使用os读取环境变量 import os os getenv 39 path 39 os environ get 39 path 39 os environ 39 path 39 2 遍历打印所有环境变量 通过访问os environ可
  • ITK——3. 编译remote库

    文章目录 1 在线编译 2 离线编译 2 1 下载对应的github库 2 2 编译 2 3 一点疑问 以ITKMinimalPathExtraction库为例 对应的github链接是 https github com InsightSo
  • Android Gradle编译改为mk编译

    原文地址 xff1a https www jianshu com p 8f00d4d692cd 最近出于工作需要 xff0c 要将一个模块由gradle编译改为mk方式加入源码编译 遇到了一些问题 xff0c 在这里记录一下 主要有以下几个
  • 生辰八字的计算

    我们常说的生辰八字 xff0c 是用天干地支表示人出生的年 月 日 时 xff0c 合起来是八个字 十天干 xff0c 甲乙丙丁午己庚辛壬癸 十二地支 xff0c 子丑寅卯辰巳午未申酉戌亥 十天干和十二地支依次相配 xff0c 如 甲子 乙
  • Androidstudio编译工程找不到对应的gradle-x.xx-all.zip文件的解决方法

    文章目录 前言一 打开gradle wrapper properties二 找到distributionUrl三 打开 gradle文件夹四 总结1 问题出现的原因2 解决思路 前言 AndroidStudio Gradle文件下载不下来的
  • Linux 系统运维常用命令

    linux 常用命令 雪松整理 Q 群 198173206 欢迎linux 系统运维朋友加入 xff01 博客 http hi baidu com quanzhou722 blog 错误在所难免 xff0c 还望指正 xff01 61 61
  • 安装更新nessus

    Ubuntu安装更新nessus 1 sudo dpkg i nessus安装包 2 service nessusd start 启动nussus服务 3 浏览器登录 4 输入注册码 43 用户名 密码 5 等待更新nussus 插件 6
  • windows10子系统安装kali并配置图形界面、中文tab命令补全

    1 开启Windows子系统功能 2 微软商店安装kali linux子系统设置账户与root账户 root账户命令 sudo passwd root 3 安装图形界面 1 apt install xorg 安装xorg 2 apt ins
  • ubuntu安装zenmap(图形化nmap)

    如何在Linux中安装Zenmap xff1f 在Ubuntu 20 04 LTS Focal Linux上安装ZenMap 由于Zenmap在Ubuntu 20 04的官方存储库中不再可用 xff0c 因此我们必须手动下载并安装它 由于依
  • 安装appimagelauncher

    安装appimagelauncher 1 sudo add apt repository ppa appimagelauncher team stable 2 sudo apt get update 3 sudo apt install a
  • Sub-process /usr/bin/dpkg returned an error code

    在用apt get安装软件包的时候遇到E Sub process usr bin dpkg returned an error code 1 问题 xff0c 解决方法如下 xff1a 1 cd var lib dpkg 2 sudo mv
  • centos6 安装或升级svn1.8

    方法一 xff1a xff08 服务器有互联网使用该方法 xff09 centos6上默认安装的是svn1 6版本 xff0c 这个版本最大的缺点是会在每一个目录下简历一个 svn目录 xff0c 导致项目很难管理 编辑文件 xff1a v
  • ITK——4. 医学影像坐标系问题(世界坐标系、解剖坐标系和图像坐标系)

    文章目录 2 坐标系方向orientation RAI AIL 2 1 统一转为RAI方向 itk的python代码 2 2 统一转为某个方向 itk的C 代码 2 3 设置成和另一个图方向一样 itk的C 2 3 1 方法2 2 3 2
  • (1)在ubuntu系统中安装docker

    目录 准备工作开始安装安装Docker引擎 卸载 准备工作 更新apt软件包索引和安装软件包 xff0c 以允许apt通过HTTPS使用repository span class token function sudo span span
  • 八十、尚硅谷kylin单机版环境——安装MySQL

    安装mysql xff08 网络正常 可以yum xff09 xff08 一 xff09 打开安装包所在地 root 64 kylin141 cd opt install root 64 kylin141 install ls apache
  • UNIX 环境高级编程之我见

    UNIX环境高级编程 xff08 第二版 xff09 xff08 人民邮电出版社 xff09 美 W Richard Stevens amp Stephen A Rago 著 本书的主要结构分为以下几个部分 xff1a xff08 1 xf