UNIX环境高级编程学习之路(五)----进程环境

UNIX环境高级编程、UNIX网络编程(卷一)环境搭建 最近学习这两本书,在直接编译书本源程序时,出现头文件“apue.h”(UNIX环境高级编程)及“unp.h”(UNIX网络编程)错误,在这里坐下配置的笔记。 首先需要安装Linux系统。(在VirtualBox虚拟机里安装Centos6.7的Linux系统) APUE: 1、使用浏览器从http://www.apuebook.com/code3e.html下载源码src.3e.tar.gz( 阅读详情

对于UNIX环境编程,工作中经常会用到相关知识,作为学习UNIX环境编程的经典书籍–UNIX环境高级编程,是每个UNIX编程人员必看的经典书籍之一,为了将相关知识重新进行学习,以系统的整合所学知识,遂以博文形式作为总结。

1、概述

当程序执行时,其main函数是如何被调用的,命令行参数是如何传递给新程序的;典型的存储空间布局是什么样式,如何分配另外的存储空间,进程如何使用环境变量,进程的各种不同终止方式等。还将说明longjmp和setjmp函数以及他们与栈的交互作用。

2、main函数

main函数原型是:

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

当内核执行C程序时(使用一个exec函数),==在调用main前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址==—这是由连接编辑器设置的,而连接编辑器由C编译器调用。==启动例程从内核取得命令行参数和环境变量值==,然后按上述方式调用main函数做好安排。

3、进程终止

有8种方式使进程终止,其中5种正常终止:

(1)从main返回;
(2)调用exit;
(3)调用_exit或_Exit;
(4)最后一个线程从其启动例程返回;
(5)从最后一个线程调用pthread_exit;

异常终止有3种方式:
(6)调用abort;
(7)接收一个信号;
(8)最后一个线程对取消请求作出响应。
* 退出函数

3个函数用于正常终止一个程序;_exit和_Exit立即进入内核,exit则先执行一些清理处理,然后返回内核。
#include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status);

exit 函数总是执行一个标准I/O库的清理关闭操作:对于所有打开流调用fclose函数。
3个退出函数都带一个整型参数。称为终止状态。大多数UNIX系统shell都提供检查终止状态的方法。如果(a)调用这些函数时不带终止状态,或(b)main执行了一个无返回值的return语句,或(c)main没有声明返回类型为整型,则该进程的终止状态是未定义的。但是,若main的返回类型是整型,并且main执行到最后一条语句时返回,那么该进程的终止状态是0。
main函数返回一个整型值与该值调用exit是等价的。于是在main函数中exit(0);等价于return(0);

  • 函数atexit

    一个进程可以登记多至32个函数,这些函数由exit自动调用。我们称这些函数为终止处理程序,并调用atexit函数来登记这些函数。

#include <stdlib.h>
int atexit(void (*func)(void));
返回值:若成功,返回0;若出错,返回非0

其中,atexit的参数是一个函数地址,当调用此函数时无需向他传递任何参数,也不期望它返回一个值。exit调用这些函数的顺序与他们登记时候的顺序相反。同一函数如登记多次,他会被调用多次。
exit首先调用各终止处理程序,然后关闭(通过fclose)所有打开流。如若程序调用exec函数族的任一函数,则将清除所有已安装的终止处理程序。
下图显示了一个C程序是如何启动的,以及它终止的各种方式。

image

注意,内核是程序执行的唯一方法是调用一个exec函数。进程自愿终止的唯一方法是显式或隐式的调用_exit或_Exit。进程也可以非自愿的由一个信号使其终止。

下列程序说明使用atexit函数。

#include <stdlib.h>
#include <stdio.h>

static void my_exit1(void);
static void my_exit2(void);

int main(void)
{
    if (atexit(my_exit2) != 0)
        printf("can't register my_exit2");
    if (atexit(my_exit1) != 0)
        printf("can't register my_exit1");
    if (atexit(my_exit1) != 0)
        printf("can't register my_exit1");

    printf("main is done!\n");
    return 0;
}
static void my_exit1(void)
{
    printf("first exit handler\n");
}

static void my_exit2(void)
{
    printf("second exit handler\n");
}

运行该程序为:
image

终止处理程序每登记一次,就会被调用一次。所以,my_exit1被调用两次,且exit调用这些函数的顺序与它们登记时候的顺序相反。

4、命令行参数

当执行一个程序时,调用exec的进程可将命令行参数传递给新程序。这是UNIX shell的一部分常规操作。

下例程序将所有命令行参数都回显到标准输出上。

#include <stdio.h>

int main(int argc, char **argv)
{
    int i;
    for (i = 0; i < argc; i++)
        printf("argv[%d]\n", i , argv[i]);
    exit(0);
}

编译次程序,得到如下结果:

因为argv[argc]是一个空指针。则我们可以将参数处理循环修改为:
for (i = 0 ; argv[argc] != NULL; i++)

5、环境表

每个程序都接收到一张环境表。与参数表一样。环境表也是一个字符数组指针,其中每个指针包含一个以null结束的C字符串的地址。全局变量environ则包含了该指针数组的地址:

char **environ;

例如,如果该环境包含5个字符串,那么他看起来如下图所示。其中,每个字符串的结尾处都显式的有一个null字节。我们称environ为环境指针,指针数组为环境表,其中各指针指向的字符串称为环境字符串。
image

在历史上,大多数UNIX系统支持的main函数带3个参数,其中第3个参数就是环境表地址:
int main(int argc, char *argv[], char *envp[]);
通常用getenv和putenv函数来访问指定的环境变量,二不是用environ变量,但是要查看整个环境,则必须用environ指针。environ环境变量指针详见:environ环境变量

6、C程序的存储空间布局

C程序一直有以下几部分组成
- 正文段
这是由CPU执行的机器指令部分。通常,正文段是可以共享的,所以,即使是频繁执行的程序(如文本编辑器、c编译器和shell等)在存储器中也只需要一个副本,另外,正文段常常是只读的,以防止程序由于意外而修改其指令。
- 初始化数据段
通常,将此段称为数据段,它包含了程序中需要明确赋初值的变量。例如,C程序中任何函数之外的声明:
int maxcount = 99;
使此变量以其初始存放在初始化数据段中。==已初始化 的 全局变量 的一块内存区域。==
- 未初始化数据段(bss段)
在程序开始执行之前,内核将此段中的数据初始化为0或空指针。函数外的声明:
long sum[1000];
将此变量存放在非初始化数据段中。==未初始化的全局变量的一块内存区域==

  • 栈
    自动变量以及每次函数调用时,所需要保存的信息都存放在此段中。每次函数调用时,其返回地址以及调用者的环境信息(如某些机器寄存器的值)都存放在栈中。然后,最近被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,C递归函数可以工作。递归函数每次调用自身时,就用一个新的栈帧,因此一次函数调用实例中的变量集不会影响另一次函数调用实例中的变量。
  • 堆
    通常在堆中进行动态存储分配。堆位于未初始化数据段和栈之间。
    典型的存储空间安排
    image
    从上图可以看到,未初始化数据段的内容并不存放在磁盘程序文件中。其原因是,内核在程序开始运行前将他们都设置为0。需要存放在磁盘文件中的段只有正文段和初始化数据段。
    size命令报告正文段、数据段和bss段的长度:
    image
    4列和5列分别是以十进制和十六进制表示的3段总长度。

7、共享库
共享库使得可执行文件中不再需要包含公用的库函数,而只需要所以进程都可引用的存储区中保存这种库例程的一个副本。程序第一次执行或者第一次调用某个库函数时,用动态链接方法将程序与共享库函数相链接。这减少了每个可执行文件的长度,但增加了一些运行时间开销。这种时间开销发生在该程序第一次被执行时,或者每个共享库函数第一次被调用时。共享库的另一个优点是可以用库函数的新版本代替老版本而无需对使用该库的程序重新连接编辑。
image

8、存储空间分配
ISO C说明了3个存储空间动态分配的函数
(1)malloc,分配指定字节数的存储区。此存储区的初始值不确定。
(2)calloc,为指定数量指定长度的对象分配存储空间。该空间中的每一位(bit)都初始化为0。
(3)realloc,增加或者减少以前分配区的长度。当增加长度时,可能需要以前分配区的内容移到另一个足够大的区域,以便在尾端提供增加的存储区,而新增区域内的初始值则不确定。

#include <stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nobj, size_t size);
void *realloc(void *ptr, size_t newsize);
返回值:若成功,返回非空指针;若出错,返回NULL
void free(void *ptr);

函数free释放ptr指向的存储空间。被释放的空间通常被送入到可用存储区池,以后,可在调用上述3个分配函数时再分配。
realloc函数使我们可以增、减以前分配的存储区的长度(最常见的是增加该区)。例如,如果先为一个数组分配存储空间,该数组长度为512,然后在运行时填充它,但运行一段时间后发现该数组原先的长度不够用,此时就可用realloc扩充相应的存储空间。如果在该存储后有足够的空间可供扩充,则可在原存储区位置上向高地址方向扩充,无需移动原先的内容,并返回与传给他相同的指针值。如果在原存储区后没有足够的空间,则realloc分配另一个足够大的存储区,返回新分配区的指针。因为这种存储区可能会移动位置,所以不应当使任何指针指在该区中。
注意,realloc的最后一个参数是存储区的新长度,不是新、旧存储区长度之差。作为一个特例,若ptr是一个空指针,则realloc功能与malloc相同,用于分配一个指定长度为newsize的存储区。
大多数实现所分配的存储空间比所要求的要稍大一点,额外的空间用来记录管理信息–分配块的长度、指向下一个分配块的指针等。

9、环境变量

环境字符串的形式是:   
name =value    

UNIX内核并不查看这些字符串,他们的解释完全取决于各个应用程序。其中一些在登陆时自动设置,有些则由用户设置。
ISO C定义了一个函数getenv,可以用其取环境变量值。

#include <stdlib.h>
char *getenv(const char *name);
返回值:指向与name关联的value的指针,若未找到,返回NULL。

我们应当使用getenv从环境中取一个指定环境变量的值,而不是直接访问environ。
image
除了获取环境变量值,有时也需要设置环境变量。也可能改变现有变量的值,或者增加新的环境变量。

#include <stdlib.h>
int putenv(char *str);
函数返回值:若成功,返回0;若出错,返回非0
int setenv(const char *name, const char *value, int rewrite);
int unsetenv(const char *name);
返回值:若成功,返回0;若出错,返回-1

这3个函数的操作如下:
* putenv取形式为name=value的字符串,将其放到环境表中,若name已经存在,则先删除其原来的定义。
* setenv将name设置为value。如果在环境中name已经存在,那么(a)若rewrite非0,则首先删除其现有的定义;(b)若rewrite为0,则不删除现有的定义(name’不设置为新的value,而且也不出错)。
* unsetenv删除name的定义。即使不存在这种定义也不算出错。

10、函数setjmp和longjmp
在C中,goto函数是不能跨越函数的,而执行这种类型跳转功能的函数是setjmp和longjmp。这两个函数对于处理发生在很深嵌套函数调用中的出错情况是非常有用的。
如以下程序:

#include <stdio.h>

#define TOK_ADD 5

void do_line(char *);
void cmd_add(void);
int get_token(void);

int main(void)
{
    char line[1024];
    while (fgets(line, 1024, stdin) != NULL)
        do_line(line);
    exit(0);
}

char *tok_ptr;

void do_line(char *ptr)
{

    int cmd;
    tok_ptr = ptr;
    while((cmd = get_token()) > 0)
    {
        switch(cmd) {
        case TOK_ADD:
            cmd_add();
            break;
        }

    }
}

void cmd_add(void)
{
    int token;
    token = get_token();

}

int get_token(void)
{


}

自动变量的存储单元在每个函数的栈帧中。数组line在main的栈帧中,整型cmd在do_line的栈帧中,整型token在cmd_add的栈帧中。

image

在编写如上的程序时遇到一个问题,如何处理非致命性的错误。如,cmd_add函数发现一个错误(比如一个无效的数),那么他可能先打印一个出错消息,然后忽略输入行的余下部分,返回main函数并读下一输出行。但是如果这种情况出现在main函数中的深层嵌套中时,用C语言难以做到这一点。
解决这种问题的方法就是使用非局部goto,setjmp和longjmp函数。非局部指的是,这不是由普通的C语言goto语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,返回到当前函数路径上的某一个函数中。

#include <setjmp.h>
int setjmp(jmp_buf env);
返回值:若直接调用,返回0;若从longjmp返回,则为非0

void longjmp(jmp_buf env, int val);

在希望返回的位置调用setjmp,在本例中,此位置在main函数中。因为我们直接调用该函数,所以其返回值为0。setjmp参数env的类型是一个特殊类型的jmp_buf。这一数据类型是某种形式的数组,其中存放在调用longjmp时能用来恢复栈状态的所有信息。因为需要在另一个函数中引用env变量,所以通常将env变量定义为全局变量。
如下为使用setjmp和longjmp函数的例子

#include <stdio.h>
#include <setjmp.h>

#define TOK_ADD   5

jmp_buf jmpbuffer;

int main(void)
{
    char line[1024];
    if (setjmp(jmpbuffer) != 0)
    {
        printf("error\n");
    }
    while(fgets(line, 1024, stdin) != NULL)
    {
        do_line(line);
    }
    exit 0;
}

...

void cmd_add(void)
{
    int token;

    token = get_token();
    if (token < 0)
    {
        longjmp(jmpbuffer, 1);
    }
}

执行main时,调用setjmp,它将所需的信息记入变量jmpbuffer中并返回0。然后调用do_line,它又调用cmd_add,假定在其中检测到一个错误。在cmd_add中调用longjmplongjmp之前,栈如下图所示。但是longjmp使栈反绕到执行main函数时的情况,也就是抛弃了cmd_add和do_line的栈帧。调用longjmp造成main中setjmp的返回,但是,这一次的返回值是1。(longjmp的第二个参数)。

image

11、函数getrlimit和setrlimit
每个进程都有一组资源限制,其中一些可以用getrlimit和setrlimit函数查询和更改。

#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlptr);
int setrlimit(int resurces, const struct rlimit *rlptr);
返回值:若成功,返回0;若出错,返回非0

对这两个函数的每一次调用都指定一个资源以及一个指向下列结构的指针。
struct rlimit {
rlim_t rlim_cur; /soft limit:current limit/
rlim_t rlim_max; /hard limit: maximum value for rlim_cur/

};
在更改资源限制时,需遵循下列3条规则。
(1)任何一个进程都可将一个软限制值更改为小于或等于其硬限制值
(2)任何一个进程都可降低其硬限制值,但他必须大于或者等于其软限制值。这种降低,对普通用户而言是不可逆的。
(3)只有超级用户进程可以提高硬限制值。
常量RLIM_INFINITY指定了一个无限量的限制。
这两个函数的resource参数取下列值之一。
image

————————————————华丽的风格线————————————————
QQ群:西安C/C++开发者,诚邀您的加入

image

深入UNIX环境高级编程:全面课件指南 UNIX操作系统是一种多用户、多任务的操作系统。其设计哲学强调简洁性和模块化,它为现代操作系统的设计提供了许多重要的概念,如进程、文件和权限等。UNIX系统在计算机网络、服务器和开发领域中具有广泛的应用。 阅读详情

相关推荐

UNIX环境高级编程(中文版)

UNIX系统的架构主要由内核和用户空间两部分组成。内核是操作系统的核心,负责管理系统资源、进程调度、内存管理和设备控制等。用户空间则是用户程序运行的环境,用户在这里执行应用程序并与系统进行交互。在上述代码中,我们使用open系统调用创建了一个名为的文件,并设置了文件的权限。接着,我们使用write系统调用将字符串“Hello, UNIX!”写入文件。最后,通过close系统调用关闭文件描述符,释放资源。在上述代码中,我们使用fork系统调用创建了一个新进程。fork。

csdn_te_DOWNload_005的博客 1629

《UNIX环境高级编程》--5 标准IO库

标准IO库流和 FILE对象 标准IO库与文件IO区别: 标准IO库处理很多细节,如缓冲区分片、以优化的块长度执行IO等。 文件IO函数都是围绕文件描述符进行。首先打开一个文件,返回一个文件描述符;后续的文件IO操作都使用该文件描述符 标准IO库是围绕流进行的。当用标准IO库打开或者创建一个文件时,就有一个内建的流与之相关联 标准IO库的函数很多都是以 f开头,如fopen、fclose对于

yqtao的博客 2996

UNIX环境下的C语言高级编程手册

本文还有配套的精品资源,点击获取 简介:在UNIX平台上进行C语言高级编程要求开发者熟悉UNIX系统调用和库函数,以便高效利用系统资源。本指南涵盖UNIX系统基础知识、C语言特性以及高级编程技巧,包括文件操作、进程间通信、系统调用、内存管理等。通过提供理论知识和实践案例,本书旨在帮助读者深入掌握UNIX下C语言编程的高级技能,并理解安全编程的重要性。 1. UNIX操...

weixin_28681379的博客 1584

UNIX环境高级编程学习之路

转:https://blog.youkuaiyun.com/drlmemory/article/details/53744791

xcw_1987的博客 1830

深入UNIX环境的高级编程实践指南

Unix/Linux系统编程是构建在操作系统提供的底层接口之上的高级编程技术,它允许程序员编写更为接近硬件的代码,以实现高效的资源管理和任务执行。本章将为读者概述系统编程的基础知识,包括进程管理、文件I/O、信号处理以及网络通信等关键概念。通过本章节的介绍,我们深入了解了文件I/O的基本操作、高级技术、文件系统的层次结构和性能调优方法。掌握这些知识对于进行高效和安全的文件管理至关重要。接下来,我们将继续探讨进程管理与控制的相关技术,进一步提升我们的系统编程能力。

weixin_34064233的博客 790

手把手教你利用qemu搭建银河麒麟V11 arm环境

在Windows环境下,初学者或企业用户常通过VMware、VirtualBox等虚拟机软件安装Ubuntu、Red Hat等Linux系统,这类工具更侧重X86等复杂指令集架构(CISC,常见于Intel、AMD处理器)的虚拟化。而QEMU是一款开源的虚拟机监视器与模拟器,核心优势在于可模拟ARM、MIPS、RISC-V等精简指令集架构(RISC)的处理器并提供虚拟化能力,更适合对虚拟化技术有一定了解的用户。可能是电脑性能问题,安装过程比较慢,需要耐心等待。等操作系统下载完成后,进行安装了。

huanhuanzhou blog 2455

UNIX基础知识

​1.1  引言 所有操作系统都为它们所运行的程序提供服务。典型的服务包括:执行新程序、打开文件、读文件、分配存储区以及获得当前时间等,本书集中阐述不同版本的UNIX操作系统所提供的服务。 想要按严格的先后顺序介绍UNIX,而不超前引用尚未介绍过的术语,这几乎是不可能的(可能也会令人厌烦)。本章从程序员的角度快速浏览UNIX,对书中引用的一些术语和概念进行简要的说明并给出实例。在以后各

zuoninger的专栏 5980

单细胞分析进阶:sctransform标准化在Seurat中的实战解析

本文深入解析了sctransform标准化方法在Seurat单细胞分析中的实战应用。通过对比传统对数标准化,sctransform能更有效地建模并剔除技术噪音,提升数据质量。文章提供了从环境配置、数据准备、核心参数解析到完整流程整合的详细指南,并针对常见问题给出解决方案,帮助研究者获得更清晰的细胞分群和更可靠的差异表达结果。

weixin_29248313的博客 150

Unix环境高级编程学习笔记(五) 进程控制

fork 函数 fork函数用于创建子进程,先看其声明方式: pid_t fork(void); 该函数如果执行成功,则会返回两次,对于父进程,返回其子进程的ID,对于子进程,返回0。 进程创建成功后,子进程会拷贝父进程的地址空间,包括数据空间,堆和栈。但这在许多情况下会不必要的耗费很多资源,所以现在的实现一般都采用了一种叫做“copy-on-write (COW)”的技术。在这种技术下,

justaipanda的专栏 2058

K230开发板实战:5步搞定YOLOv8模型部署(附常见报错解决方案)

本文提供了一份详细的K230开发板部署YOLOv8模型的实战教程。内容涵盖从环境准备、模型转换到代码编写的完整流程,并重点解析了使用AICube工具链时常见的“生成部署文件异常”等报错解决方案,旨在帮助开发者高效完成嵌入式AI模型部署。

weixin_29053073的博客 784

BERTopic安装指南:hdbscan依赖问题全解析(附解决方案)

本文详细解析了安装BERTopic时常见的hdbscan依赖报错问题,深入剖析了C++编译环境缺失、Python版本兼容性以及包管理渠道混用三大核心原因。针对Windows、macOS和Linux不同系统,提供了创建虚拟环境、使用conda安装预编译包、安装C++编译工具等具体解决方案,帮助用户顺利安装BERTopic并开始文本主题建模实践。

weixin_29061041的博客 213

UNIX环境高级编程

转自:unix环境高级编程 I/O 文件系统 进程 线程 进程间通信 一.文件I/O三.标准I/O库八.高级I/O 二.文件和目录 四.进程环境五.进程控制 六.线程七.线程控制 九.进程间通信十.信号 一.文件I/O 1.文件描述符 2.相关调用 2.1 打开文件 2.2 创建文件 2.3 关闭文件 2.4 定位读写位置 2.5 文件读 2.6 文件写 2.7 fcntl函数 3.进程间文件共享 4.原子操作 5.数据同步 二.文件和目录 前言:文

qq_39815320的博客 3617

STM32CubeMX 6.4.0 + STM32F407ZGT6 实战:基于YT8512C PHY的lwIP以太网配置与调试

本文详细介绍了使用STM32CubeMX 6.4.0为STM32F407ZGT6微控制器配置YT8512C PHY芯片,并成功移植lwIP以太网协议栈的实战过程。文章从硬件差异分析入手,逐步讲解时钟配置、ETH外设设置、PHY寄存器适配以及lwIP协议栈剪裁等关键步骤,旨在帮助开发者解决非标准PHY芯片的联网难题,最终实现网络连通与Ping测试。

n8m7b6v5c4的博客 593

《UNIX环境高级编程》学习笔记

《Unix环境高级编程》学习笔记 第一章 NUIX基础知识 1.5输入和输出 文件描述符通常是一个非负整数,用以标识一个特定进程正在访问的文件 运行一个新程序,所有shell会为其打开3个文件描述符:标准输入/输出/错误 不带缓冲的I/O 标准I/O 1.6程序和进程 #include "apue.h" #include <sys/wait.h> // 相当于模拟了一个shell的处理过程 int main(void) { char buf[MAXLINE]; /* from apue.h *

qq_42526420的博客 2885

Windows11 升级到24H2后,原本的protel99se软件的DDB图纸文件打不开解决办法

Windows11更新后无法打开DDB文件

xingchen2837的博客 416

OpenCV入门(一)Python环境的搭建

因为有点Python基础,并且Python是比较好入门的编程语言,所以,机器视觉后面打算在Python这个平台下进行。

小幽余生不加糖 8121

【unix】unix环境高级编程

一 创建 ⑴线程命名规则 nioEventLoop-1-XX -1指的是线程池 -XX在group中的loop 创建并保存线程执行器 创建mpscQueue异步任务队列 创建线程选择器,循环nioEventLoop数组 二 启动 1.服务端启动绑定端口 2.新连接接入 三 执行 一个普通任务队列 一个定时任务队列 任务聚合时会把定时任务队列拉去到普通任务队列,保证串行无锁化 四 亮点 ⑴ ⑵ha...

屎蛋的铲屎官 1674

《嵌入式最全面试题-Offer直通车》目录

嵌入式领域蓬勃发展,嵌入式工程师成为众多科技企业争抢的热门人才。如果你渴望在嵌入式面试中脱颖而出,成功斩获心仪的 offer,那么《嵌入式最全面试题 - Offer直通车》将是你的绝佳选择。本专栏是优快云是热门专栏,100多篇文章,总字数过百万。每月新增订阅用户过百,现在是优惠价9.9元,后面要逐渐恢复原价,早订阅早受益。本专栏精心整理了众多超万字的精华内容,总计达数十万字的嵌入式面试题总结。涵盖从嵌入式基础知识到各大厂面试真题,从驱动开发到操作系统,从硬件到软件等各个方面。

大模型大数据攻城狮的专栏 8395

《UNIX 环境高级编程》核心思想讲座课件

被誉为UNIX编程"圣经"的经典著作作者:W. Richard Stevens和Stephen A. Rago第1版(1992年)、第2版(2005年)、第3版(2013年)的演进Dennis Ritchie(UNIX和C语言之父)评价:“这是一本弥足珍贵的经典著作”进程间通信的需求与挑战UNIX/Linux中的IPC机制分类IPC机制的选择依据深入理解操作系统工作原理掌握底层编程技能的重要性UNIX设计哲学在现代软件开发中的应用。

AI天才研究院 1187

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

UNIX高级环境编程-初读心得

写在前面 大概从7月中旬~10月10中旬,花了大概三个月左右的时间,通读了《UNIX高级环境编程》第1章到第20章。读之前的状态大概是只懂一点linux命令行,c语言入门水平。通读的过程大概就是每天早上花1至2个小时,对于书中的一些代码,尽量都照着抄了一遍,写了一些对代码的理解在上面。学习过程中我个人觉得有一些章节读起来就比较枯燥,而有一些章节读起来则津津有味。因为就读了一遍,所以经常会有前面的知...

每天完成一个小目标 3147

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

《UNIX环境高级编程》进程环境、进程控制

2301_80345648的博客 1051

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《UNIX 环境高级编程(第 3 版)》剖析

UNIX 环境高级编程(第 3 版)》作为 UNIX 编程领域的经典之作,不仅涵盖了 UNIX 系统编程的各个方面,还通过大量的代码示例和深入的讲解,帮助读者深入理解 UNIX 系统的底层机制,掌握编写高效、可移植的 UNIX 应用程序的技巧。无论是对于初学者还是有一定经验的开发者,本书都具有极高的学习价值和参考价值。随着技术的不断发展,UNIX 系统也在不断演进,新的特性和功能不断涌现。

数字魔方操控师的博客 1088

5w字总结 Unix系统编程学习笔记(面试向)(Unix环境高级编程/Unix环境程序设计)

文章目录一、计算C语言的数据表示与处理计算C语言的基本运算操作内存表和符号表类型转换函数类型的分析指令复合指令句法函数函数激活(Activation Record)函数激活定义函数激活存储内容二、并发多道程序设计和分时Unix分时:存储的保存和加载中断(interrupt)时钟中断( Clock Interrupt )系统调用(system call)进程切换(上下文切换)分时的实现应用层并发三、程序、进程和线程什么是程序?什么是进程?进程的状态有哪些?其转换关系是怎么样的?进程什么时候开始产生/运行?什么

weixin_47826078的博客 5073

UNIX环境高级编程学习总结

这些日子学习了一下APUE(Advanced Programming in the UNIX,UNIX环境高级编程)。这是一本公认的好书,它详细的讲解200多个函数、提出并解决各种可能存在的问题,这绝对是UNIX程序员居家旅行必备宝典。对于初学者来说它讲得太细太繁杂了。学习完本书后,总体的对它有了点认识,并懂得了使用里面常用的函数。下面是简单的对本书重要的章节给个大体的介绍。 本书印象 本

gh722305的博客 1624

Unix环境高级编程与Unix网络编程学习资料集:深入理解Unix编程精髓

Unix环境高级编程与Unix网络编程学习资料集:深入理解Unix编程精髓 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 集成《Unix环境高级编程》与《Unix网络编程》学习资源,助力Unix/Linux程序设计与网络开发技能提升。 项目介绍 在计算机科学领域,Unix系统编程一直是技术人员追求的高峰。Unix环境高级编程与Unix网络编程学习资料集,正是...

gitblog_06745的博客 996

《UNIX 环境高级编程》学习笔记—— 进程环境

UNIX环境高级编程——进程环境引言main 函数进程终止命令行参数环境表C 程序的存储空间布局共享库存储空间分配环境变量函数 setjmp 和 longjmp函数 getrlimit 和 setrlimit小结 引言 main 函数 进程终止 命令行参数 环境表 C 程序的存储空间布局 共享库 存储空间分配 环境变量 函数 setjmp 和 longjmp 函数 getrlimit 和 setrlimit 小结 学习参考资料: 《UNIX 环境高级编程》第3版 ...

weixin_45243288的博客 891
上一篇: UNIX环境高级编程学习之路(四)----系统数据文件和信息
下一篇: UNIX环境高级编程学习之路(六)----进程控制
drlmemory
博客等级 码龄14年 15粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值