[APUE]第一章UNIX基础知识总结

吐血总结《Mysql从入门到入魔》,图文并茂 文章目录1. 查询1.1 查询多列1.2 检索唯一值1.3 限制输出1.4 注释2. ORDER BY 排序2.1 单列排序3.2 多列排序3.3 指定排序方向4. WHERE 过滤数据4.1 WHERE 子句操作符4.2 范围值检查4.3 空值检查5. 高级数据过滤5.1 WHERE 组合过滤5.2 IN 操作符5.3 NOT 操作符6. 通配符过滤6.1 % 通配符6.2 _ 通配符7. 创建计算字段7.1 计算字段7.2 拼接字段7.3 执行算数计算8. 函数8.1 常用文本处理函数8.2 日期和时间 阅读详情
UNIX简介

操作系统的狭义定义,是将操作系统定义为一种控制计算机资源,提供程序运行环境的软件,通常我们称之为内核,内核提供接口供上层应用调用,也叫做System Call(系统调用)。同时,为了方便应用程序使用内核,通常都会有公用函数库,应用程序既可以使用系统调用,也可以使用公用函数库。系统调用和公用函数库实际上并不是同一个东西,但是对于开发者来说,可以当作同一个层,都可以使用C函数来调用。再向上,就是shell终端,作为人机交互部分,最外层则是应用程序。
而从广义上来说,操作系统就是一个包含了内核和必备系统软件的集合,这些软件是支持一个系统正常运转使用、人机交互的最小要求。
目前来说,已经不存在真正的Unix系统了,因为自从AT&T公司封闭Unix源代码,Unix的变种分支就出现了很多,其中学院派BSD,商业SystemV,和开源的Linux最重走到了最后。其中,BSD原先是基于AT&T开放代码构建,后来Unix实验室被卖给了Novell,Novell授权BSD开发Unix,但是去除了源自AT&T的源代码,最终形成了BSD-4.4 Lite,也是目前很多类Unix操作系统的基石。商业SystemV则是AT&T联合许多公司,用于解决Unix混乱的商业版本,所以后来的很多商业Unix都是基于SystemV release4版本,而后Unix被卖给Novell,最终到了X/OPEN Consortium,即后来的Open Group。

文件和目录
#include "apue.h"
#include <dirent.h>

int
main(int argc, char *argv[])
{
    DIR             *dp;
    struct dirent   *dirp;

    if (argc != 2)
        err_quit("usage: ls directory_name");

    if ((dp = opendir(argv[1])) == NULL)
        err_sys("can't open %s", argv[1]);
    while ((dirp = readdir(dp)) != NULL)
        printf("%s\n", dirp->d_name);

    closedir(dp);
    exit(0);
}

函数opendir()打开我们传入的目录,返回的是目录流,函数readdir()读取目录流信息,readdir()返回参数dir目录流的下个目录进入点。
关于APUE书中代码的运行,作者给出的源代码中有些不太方便,要根据英文意思去看代码,没有唯一的文件名与之对应,但这一点来看

输入输出
#include "apue.h"
#define BUFFSIZE    4096
int
main(void)
{
    int     n;
    char    buf[BUFFSIZE];

    while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
        if (write(STDOUT_FILENO, buf, n) != n)
            err_sys("write error");

    if (n < 0)
        err_sys("read error");

    exit(0);
}

这个例子让我看到时闹了个笑话:
第三版书中有这么一句话:

若以下列方式执行该程序:
./a.out < infile >outfile

我当时在想<>是什么奇怪的语法,难道是可以省略文件infile的意思,直到我在心爱的mac上运行了这个程序。

原来这不就是重定向语法吗?
shell中>表示输出重定向 <表示输入重定向
./a.out < infile >outfile的意思是标准输入重定向到文件infile 标准输出重定向到文件outfile,实现了文件infile拷贝到outfile.
文件描述符在C语言内部是一个非负整数,内核用其来标示一个进程访问的文件,每个进程都维护自己的文件描述符,按照标准规定,当一个进程运行时,都默认打开三个文件描述符,即标准输入、标准输出和标准错误,正常情况下,这三个文件都指向终端输出,但是在终端可以使用重定向的方式将这三个文件描述符指向不同的地方。我们可以查看一下系统头文件
vim /usr/include/unistd.h
找到如下内容:

#define  STDIN_FILENO   0       /* standard input file descriptor */
#define STDOUT_FILENO   1       /* standard output file descriptor */
#define STDERR_FILENO   2       /* standard error file descriptor */

实际上0、1、2就默认已经被使用了,如果我们在此基础上新打开一个文件,实际上是增加在3的位置,而且每个进程都有0、1、2的文件描述符。

程序与进程

程序是一段放置于磁盘上的二进制代码,内核使用exec函数族来讲进程读入内存,并且执行程序,在内存中运行的程序实例被称为进程,Unix标准要求每个进程都有唯一表示符(process ID即pid),pid是一个非负整数。

#include "apue.h"

int
main(void)
{
    printf("hello world from process ID %ld\n", (long)getpid());
    exit(0);
}

getpid函数得到进程ID,getpid返回一个pid_t数据类型,虽然大多数进程ID可以用整数表示,但用长整型可以提高移植性。
进程控制有主要三个函数:fork、exec和waitpid。(exec函数有7种变体,但是一般统称exec函数)

#include "apue.h"
#include <sys/wait.h>

int
main(void)
{
    char    buf[MAXLINE];   /* from apue.h */
    pid_t   pid;
    int     status;

    printf("%% ");  /* print prompt (printf requires %% to print %) */
    while (fgets(buf, MAXLINE, stdin) != NULL) {
        if (buf[strlen(buf) - 1] == '\n')
            buf[strlen(buf) - 1] = 0; /* replace newline with null */

        if ((pid = fork()) < 0) {
            err_sys("fork error");
        } else if (pid == 0) {      /* child */
            execlp(buf, buf, (char *)0);
            err_ret("couldn't execute: %s", buf);
            exit(127);
        }

        /* parent */
        if ((pid = waitpid(pid, &status, 0)) < 0)
            err_sys("waitpid error");
        printf("%% ");
    }
    exit(0);
}

在这个程序里使用了标准I/O函数fgets从标准输入读取一行,当输入文件结束符Ctrl+D时候,fgets返回一个null指针,然后就会直接执行exit(0);让进程退出
fgets每次读取的一行都以换行符终止,所以buf最后两个字符就是’\n’和’\0’,但是execlp函数要求参数必须以’\0’结尾,不需要’\n’换行符,所以我们使用’\0’字符先替换了’\n’,让execlp函数能顺利执行
调用fork函数创建一个新进程,新进程是父进程的副本,fork对父进程返回子进程的pid,对子进程则返回整数0,并且子进程是完全复制父进程的当前内存空间,所以子进程一开始执行的代码就是父进程正在执行的代码,所以说fork函数被调用一次(在父进程调用),但返回两次(父进程和子进程都得到返回值)
根据fork函数的返回值判断当前进程是子进程还是父进程,在子进程中,调用execlp执行命令,使用新的程序文件替换了原先子进程的程序文件。而父进程则使用waitpid等待子进程的终止,当一切执行完毕,则打印出新的提示符%
在上面的例子中我们如果按下中断键,则执行此程序的进程终止。产生这种后果的原因是:对于此信号(SIGINT)系统默认动作是终止进程。在下面的例子中我们调用signal()函数捕获此信号,打印一条信息。

#include "apue.h"
#include <sys/wait.h>

static void sig_int(int);       /* our signal-catching function */

int
main(void)
{
    char    buf[MAXLINE];   /* from apue.h */
    pid_t   pid;
    int     status;

    if (signal(SIGINT, sig_int) == SIG_ERR)
        err_sys("signal error");

    printf("%% ");  /* print prompt (printf requires %% to print %) */
    while (fgets(buf, MAXLINE, stdin) != NULL) {
        if (buf[strlen(buf) - 1] == '\n')
            buf[strlen(buf) - 1] = 0; /* replace newline with null */

        if ((pid = fork()) < 0) {
            err_sys("fork error");
        } else if (pid == 0) {      /* child */
            execlp(buf, buf, (char *)0);
            err_ret("couldn't execute: %s", buf);
            exit(127);
        }

        /* parent */
        if ((pid = waitpid(pid, &status, 0)) < 0)
            err_sys("waitpid error");
        printf("%% ");
    }
    exit(0);
}

void
sig_int(int signo)
{
    printf("interrupt\n%% ");
}
Jetson AGX Orin到手必看:DP线选错黑屏、SSD不识别?这篇避坑指南帮你一次搞定 本文详细介绍了Jetson AGX Orin开发套件的硬件避坑指南,涵盖开箱检查、DP线选择、SSD兼容性等关键问题。通过实测数据和实用技巧,帮助开发者避免黑屏、存储不识别等常见问题,提升开发效率。特别推荐符合VESA认证的DP 1.4a线缆和兼容性优秀的SSD型号,确保设备稳定运行。 阅读详情

相关推荐

同花顺【红绿趋势】幅图指标 源码分析

a10:IF(差值<=0 ,0 ,差值*0.2 ,4 ,0),STICK,linethick5,colorred;a7:IF(差值<=0 ,0 ,差值*0.8 ,4 ,0),STICK,linethick5,colorred;a8:IF(差值<=0 ,0 ,差值*0.6 ,4 ,0),STICK,linethick5,colorred;a6:IF(差值<=0 ,0 ,差值*1 ,4 , 0),STICK,linethick5,colorred;DRAWICON(先锋<0,-25,1);

zhibiaogong的博客 4065

APUE读书笔记(1) 第一章 UNIX基础知识

第一章 UNIX基础知识 1.UNIX是一个操作系统,操作系统可以定义为一种软件,控制计算机硬件资源,提供程序运行环境。我们通常叫这种软件为内核。 2.UNIX操作系统包括以下几个部分,由内到外为内核,系统调用,shell,公共函数库,应用程序。 3. TODO ...

myz123321的博客 436

一个基于ZYNQ、AXI接口的PL端卷积加速器,可由PS端调用(附Github源码)

一个基于ZYNQ,AXI接口的PL端卷积加速器,可由PS端调用开发板型号:Zynq-7000 SoC XC7Z305 FPGA开发平台:Vivado 2019.1;Github源码链接:https://github.com/CY0807/ZYNQ_PL_CONV_ACC。

跳跳骑士的博客 1306

APUE 第一章 UNIX基础知识

第一章 UNIX基础知识 1 UNIX体系结构 内核 : 控制计算机硬件资源,提供程序运行环境的一种软件,也可称之为操作系统。 shell : 一个特殊的程序,为运行其他程序提供一个接口。 公用函数库 : 构建在内核的接口(系统调用)之上。 如图,应用程序可以直接调用内核接口、shell以及公用函数库 1.1 登录 登录名 用户登录的名字、标识。可以在系统的口令文件中查看相关信息。 命令文件通常在/etc/passwd中, 如图,每一行都是一个登录项,登录项的格式如下: ​ 登录名 : 加密口令

weixin_43599089的博客 1005

LAP-D协议概述

Q.921协议由称为LAPD(链路访问协议-D通道),与HDLC的关系密切,它是在ISDN D通道上使用的数据链路协议。 注:http://www.freesoft.org/CIE/Topics/125.htm LAP-D的帧格式 标志、位填充技术和FCS校验计算与HDLC一致。 16位的地址包括C/R字段、SAPI(服务访问点标识)和TEI(端点标识)。TEI用于区分使用相同ISDN...

系统运维 1914

学习使用turtlebot2——ROS上安装turtlebot2

安装环境:    安装Ubuntu 14.04版本和ROS Indigo    参考:http://wiki.ros.org/turtlebot/Tutorials安装步骤    有两种安装方法,一种直接的安装命令,另外一种源码编译安装,区别在于:直接安装命令是安装在电脑默认路径/opt/ros/indigo/share里面不便于更改代码,因为默认路径下文件一般有访问权限,无法直接更改,需要使用s...

weixin_42670641的博客 2531

APUE第一章 UNIX基础知识

前语:本人是半路出家做程序员,实际上应付平时工作中的业务还可以,但是基础知识实在薄弱,当然也跟中国计算机教育有关系,平时跟同事聊天,实际上就算是科班出身,对于计算机本身的了解也知之甚少,因此在毕业两周年到来的时候,给自己确定了以后的技术学习方向,同时也决定了将基础部分补充起来,特来优快云开这个专题,去学习程序员圣经般著作—《UNIX高级环境编程》,这本书也是被某个同事经常提起,书本比较厚,但是不

fusan2004的博客 824

《华为项目管理之道》第1章笔记

performance indicator,KPI)纳入个人绩效承诺书,贯彻结果导向的理念,以向员工。客户需求是华为发展的原动力,为客户服务是华为存在的唯一理由。目经理‘用兵’,依靠市场机制‘调兵’”,打破了人员在功能部门的板结,实现了听得。为管理者选拔的必要条件,项目经理成为人人向往的岗位。《华为项目管理之道》,是新出的华为官方的项目管理书,整个书不错。伴随着项目型组织的建立,华为逐步形成了完备的项目管理流程和制度,从而将业务运。为此,通过改革,重新明确了项目经理承担的经营责任,并开始以项。

jackyrongvip的专栏 2127

《apue》读书笔记 第一章 UNIX基础知识

第一章 UNIX基础知识1.UNIX体系结构系统调用:内核的接口;公用函数库:构建在系统调用接口之上;shell:为运行其他应用程序提供了一个接口。 UNIX操作系统的体系结构 2.登陆2.1用户名系统是用数值id来表示用户的,但为方便可读性,id和用户名之间存在一一映射。系统口令文件在/etc/passwd中,为保证密码安全,加密口令转移到另一个文件中了。2.2shell我们linux常用

jiange_zh的博客 823

TBtools的序列提取步骤

本教程详细介绍了如何使用TBtools软件从原来的FASTA序列中提取特定的DNA序列。

weixin_47509995的博客 1万+

5.2.4_标志位的生成

计算机组成原理之标志位的生成

人生得意须尽欢 7596

【APUE】1、第一章 UNIX基础知识

第一章       UNIX基础知识   1、如何运行书中的例子    方法一: 1.APUE2源代码下载:http://www.apuebook.com/src.tar.gz 2.我保存到了/root下.解压缩:tar -xzvf src.tar.gz 3.cd apue.2e进入apue.2e目录,查看README,告诉我们linux系统只要修改Make.defines.linu

cutter_point的专栏 1399

ncode控件使用总结

数据格式txt转s3t #HEADER #TITLES Absolute_Time,COG_Ax,COG_Ay,COG_Az,LF_SPINDLE_AZ #UNITS ,g,g,g,g, #DATATYPES Double,Float,Float,Float,Float #DATA 2. 导入s3t数据 3. 输入数据控件 直接拖入数据源或者添加控件数据 4.

技术联盟 2006

APUE第一章 Unix基础知识

Xcode下导入apue.h下载apue.3e包,在apue.3e/include下找到apue.h。把apue.3e放到自定义文件夹,这里是/Users/hupac/Public/Lib/ 在Xcode中找到项目,修改项目的Build Settings,添加Header Search Paths为/Users/hupac/Public/Lib/apue.3e/include/。添加Lib

博客 558

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

APUE-第一章学习-UNIX基础知识-习题

APUE - 第一章习题练习

SJWL2012的专栏 688

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

(apue学习)第一章 UNIX基础知识

UNIX体系结构可将操作系统定义为一种软件,控制硬件资源,提供程序运行环境。通常称之为内核 UNIX操作系统体系结构: 内核的接口被称为系统调用。公用函数库构建在系统调用接口之上,应用程序既可使用公用函数库,也可使用系统调用。shell是一个特殊的应用程序,为运行其他应用程序提供了一个接口。文件和目录UNIX中一切皆文件,文件在Unix环境中是非常重要的东西,Unix文件系统就是一个虚拟层次

DerekRay的博客 572

APUE读书笔记之第一章 UNIX基础知识

1.UNIX系统的程序设计接口包括系统调用接口和标准C库提供的很多函数(注意本书对它们的称呼,系统调用接口跟函数)。2.UNIX体系结构:内核(kernal)就是操作系统,它控制计算机硬件资源,提供程序运行时的环境。内核的接口称为系统调用(system call)。公用函数库构建在系统调用接口之上,应用程序既可以使用公用函数库,也可以使用系统调用。shell是一个特殊的应用程序,为运行其他应用程序...

qq_34514528的博客 273

[Linux] [阅读] [APUE] - 第一章 UNIX基础知识

程序清单1-1:列出指定目录中所有文件的名字,即命令ls的简要实现 #include "apue.h" #include &lt;dirent.h&gt; int main(int argc, char *argv[]) { DIR *dp; struct dirent *dirp; if (argc != 2) ...

CAESAR的专栏 273

【APUE】第一章-UNIX基础知识+课后习题

基础知识 登录相关知识 口令就是指密码;口令文件通常是指/etc/passwd,里面存储了用户的所有信息,口令文件中的每一行(登录项)展示着由冒号分隔的7个字段, 依次是:登录名:加密口令:数字用户ID:数字用户组ID:注释字段:起始目录:shell程序。 目前,所有系统都将加密口令移到了另一个文件中。 文件路径 以’/'开头的是绝对路径,如/etc/passwd;其他的是相对路径,如假设当下在...

梦想道路上的萌新 330

[单刷APUE系列]第一章——Unix基础知识[1]

目录 [单刷APUE系列]第一章——Unix基础知识[1][单刷APUE系列]第一章——Unix基础知识[2][单刷APUE系列]第二章——Unix标准及实现[单刷APUE系列]第三章——文件I/O[单刷APUE系列]第四章——文件和目录[1][单刷APUE系列]第四章——文件和目录[2][单刷APUE系列]第五章——标准I/O库[单刷A...

weixin_34332905的博客 239

APUE学习笔记(1)——UNIX基础知识(第一章)

         首先给出一个APUE2e英文电子书的链接:  http://book.chinaunix.net/special/ebook/addisonWesley/APUE2/大家可参照该书的内容来点评这一系列学习笔记。        这一章讲的是UNIX系统的一些基础知识,对后续各章中所要涉及到的知识做了个大概介绍。依照我的理解,这一章重点要掌握的是如下一些概念:系统调用和库函数

彭令鹏(bripengandre)的专栏 2150

APUE学习: 第一章, Unix基础知识

一, Unix操作系统体系结构   内核提供系统调用,  部分C库函数使用系统调用实现, 应用程序可以调用shell, 库函数, 和系统调用 二, 知识点 每个进程有三个时间, 可以用time命令查看: 时钟时间: 即实际耗时, 包括进行运行时间和中断时间用户CPU时间:  程序用户态所花时间系统CPU时间:  程序在内核态所花时间CPU时间: 用户CPU时间

poppick的专栏 329

apue学习笔记(第一章UNIX基础知识)

UNIX基础知识

Runnyu的博客 589

[单刷 APUE 系列]第一章——Unix 基础知识[1]

原文来自静雅斋,转载请注明出处。 文章系列原因 Unix系统标准作为目前开发最重要的系统标准,应当是必须懂得的,无论是服务端C++开发还是安卓、iOS开发,实际上都和Unix环境开发密切相关,一个Unix环境开发者在入手安卓和iOS开发,是从来不会去询问很基础的一些问题,比如动态库静态库搜索路径、编译选项、环境变量的问题。目前笔者认为《Unix环境高级编程》ver3是最好的一部Unix环境开发...

weixin_34111819的博客 145

[单刷APUE系列]第一章——Unix基础知识[2]

目录 [单刷APUE系列]第一章——Unix基础知识[1][单刷APUE系列]第一章——Unix基础知识[2][单刷APUE系列]第二章——Unix标准及实现[单刷APUE系列]第三章——文件I/O[单刷APUE系列]第四章——文件和目录[1][单刷APUE系列]第四章——文件和目录[2][单刷APUE系列]第五章——标准I/O库[单刷A...

weixin_34253539的博客 184

【APUE笔记】第一章 UNIX基础知识

1.文件描述符   文件描述符是一个小的非负整数,内核用以标识一个待定进程正在存访的文件。当内核打开一个现存文件或创建一个新文件时,它就返回一个文件描述符。当读、写文件时,就可以使用它。 2.不用缓存的I/O   函数open、read、write、lseek以及close提供了不用缓存的I/O。这些函数都用文件描述符进行工作。 3.标准I/O   标准I/O函数提供一种对不用缓存的I/O函数的带缓存的界面。使用标准I/O无需担心如何选取最佳的缓存长度。 4.程序   程序是存放在磁盘中的可执行文件。使用6

T_zty_Y的博客 227
上一篇: TLPI-Chapter 20 信号
下一篇: [apue]UNIX高级环境编程ver3勘误表[持续更新]
52coder
博客等级 码龄17年 87粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值