阅读笔记之——Unix环境高级编程

Unix/Linux 命令参考

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hfwbvhul-1624204711221)(C:\Users\lh\AppData\Roaming\Typora\typora-user-images\image-20210608131137566.png)]

英文目录

POSIX 1003.2 标准可移植操作系统接口(界面)
system call interface系统调用接口
bourne-again shellbash shell
cd /usr/include/这个是c编译器源文件代码路径
cd . .切换至当前目录位置的上一级目录
cd ~切换至当前用户目录
cp error.c /usr/include/复制文件
yum install make -y安装 make
ls列出当前目录下的所有文件
make编译众多相互关联的源代码文件,是GNU的工程化编译工具
./到当前目录下去寻找。
ll + 文件名查看文件及目录详情
nmcli网络管理命令
wget从指定的url下载文件
$?Shell解释器的内设变量,用于显示上一条命令执行后的返回值
tree查看当前路径下的文件树
.一个小数点表示指向当前目录
两个小数点表示指向父目录

第一章 Unix 基础知识

1、从广义上说,操作系统包括了内核和一些其他软件。这些软件使得计算机能够发挥作用,并使计算机具有自己的特性。

  • 系统实用程序 system utility
  • 应用程序
  • shell
  • 共用函数库

交互式 shell

shell 脚本

cd /usr/include/这个是c编译器源文件代码路径
cd . .切换至当前目录位置的上一级目录
cd ~切换至当前用户目录
cp error.c /usr/include/复制文件
yum install make -y安装 make
ls列出当前目录下的所有文件
make编译众多相互关联的源代码文件,是GNU的工程化编译工具
./到当前目录下去寻找。
ll + 文件名查看文件及目录详情
nmcli网络管理命令
wget从指定的url下载文件
$?Shell解释器的内设变量,用于显示上一条命令执行后的返回值
tree查看当前路径下的文件树

2、Linux系统下 我的第一个.c文件的运行

  • 第一步:首先需要下载文件 apue.3e http://www.apuebook.com/src.3e.tar.gzap

  • 第二步:根据这个教程,放在指定目录下,apue.h头文件(UNIX环境高级编程)_yofer张耀琦的专栏-CSDN博客

  • 第三步:gcc text.c 执行这个指令,后面的文件名,注意要写明后缀为.c,会生成一个 a.out 可执行文件

  • 第四步: ./a.out 执行刚才生成的可执行文件,注意前面有个小数点,表示在当前目录下。

    • 每个.c文件都会编译生成 a.out 文件,也可以将其重命名,但是目前没这个必要,就简简单单的来吧~~~

实现了几个书上的例程,第一章完结~~~

第二章 UNIX标准及实现

ANSI美国国家标准学会
ISO国际标准化组织
IEC国际电子技术委员会
ISO C标准由ISO/IEC的C程序设计语言国际标准工作需要维护和开发
POSIX标准可移植操作系统接口(界面)
POSIX1003.1 或称为 POSIX.1操作系统接口标准,是接口,而不是实现,POSIX.1 服从 ISO 标准
POSIX1003.2实用程序
#普通用户
$管理员用户
SUSsingle unix specification ||||| 单一UNIX规范
XSIX/open system interface |||| X/open 系统接口
open group由两个工业社团 X/Open 和 开放系统软件基金会合并构成
open system software foundation OSF开放系统软件基金会

什么叫套接字?

  • 套接字,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程 。应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口

三个主要标准的说明

  • ISO C
  • POSIX
  • SUS
// 查看 gcc 版本
[root@linuxprobe ~]# gcc -v

//  输出结果
使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
目标:x86_64-redhat-linux
配置为:../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl --disable-libmpx --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
线程模型:posix
gcc 版本 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC) 

第三章 文件I/O

1、主要函数:

  • open
    • openat
  • creat
  • close
  • lseek
  • read
  • write

2、什么是原子操作?

指 由多步组成一步的操作,如果某个操作原子的执行,就表示这个操作要么执行完所有的操作,要么一步也不执行,不可能只执行所有步骤的一个子集。

  • 如UNIX系统提供了一种原子操作,将定位到文件尾端和写操作合并为一个原子操作,避免了两个函数分开调用带来的错误。
  • 如检查文件是否存在和创建文件这两个操作也是作为一个原子操作执行的

3、文件描述符

1.每个进程对应一张打开文件描述符表,这是进程级数据结构,也就是每一个进程都各自有这样一个数据结构;

2.内核维持一张打开文件表,文件表由多个文件表项组成,这是系统级数据结构,也就是说这样的数据结构是针对于整个内核而言的,每个进程都可共享的;

3.每个打开的文件对应一个i节点(i-node)数据结构(Linux下只有i节点没有v节点),由于这是每一个打开的文件与之对应的,因此这也是一个系统级数据结构,存在于内核中,非进程所独有。

这部分在 《Linux就该这么学》 的第三章:

标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或命令中输入。

标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。

错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。

4、输入输出重定向( I/O 重定向)

  • 输入重定向是指把文件导入到命令中

  • 输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。

  • 在日常的学习和工作中,相较于输入重定向,我们使用输出重定向的频率更高,

  • 所以又将输出重定向分为了标准输出重定向和错误输出重定向两种不同的技术,以及清空写入与追加写入两种模式。

5、core dump

程序的主存镜像存放在磁盘的一个文件中以便测试诊断

6、本章小结

本章说明了UNIX系统提供的基本I/O函数。

不带缓冲的I/O函数:

  • read、write这些在内核执行,所以称之为不带缓冲的。

原子操作的进行:

  • 多个进程对同一文件进行追加写操作

  • 多个进程创建同一文件

第四章 文件访问权限

wget文件下载指令

1、文件类型

  • 共有7中,最常用的是普通文件类型和目录

第7章 进程环境

1、main 参数含义

哇哦~ 这个之前一直没闹明白

argv: 在 shell 中传递给进程的命令行参数列表,argv[0] 永远是命令本身,第一个参数从 argv[1] 开始。

这是一个二维数组,其实就是一个字符串数组而已。很多童鞋不理解它为什么是一个二维数组,说明你的 C 语言基础没有学好。

字符串本身就是一个 char 数组,而保存多个字符串的数组自然就是一个 char 型二维素组了。

// C程序总是从 main 函数开始执行,main 函数的原型如下:
// argc 是命令行参数的数目,也就是argv 中字符串的数量,也就是传递给程序的命令行参数的数量。
// argv 是指向参数的各个指针所构成的数组
// 内核执行 C程序时,还涉及到 exec 函数的调用

int main(int argc, char* argv[])

exit(main(argc, argv));	// 启动例程通常是汇编代码实现的,将其转化为C语言的形式大概为这样而已~

在执行main之前,是需要先执行一个启动例程的

启动例程负责从内核取得命令行参数和环境变量的值,然后为按上述方式调用main函数作好安排

2、ls 查看文件的权限等信息

[root@linuxprobe environ]# ls -l a.out

3、size 查看正文段、数据段、bss段的长度(以字节为单位)

[root@linuxprobe environ]# size a.out

4、环境变量

可以简单的理解为就是操作系统的全局变量

gcc main.c		// 不进行任何优化的编译
gcc -O main.c	// 进行全部优化的编译
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值