一、main函数

C程序总是从main函数开始。当内核执行C程序时,在调用main前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址——这是由连接编译器设置的,而连接编译器则由C编译器调用(通常是cc)。启动例程从内核取得命令行参数和环境变量值。然后调用main函数。

二、进程终止

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

(1)从main返回

(2)调用exit

(3)调用_exit或_Exit

(4)最后一个线程从启动例如程返回

(5)最后一个线程调用pthread_exit

异常终止有3种方式:

(6)调用abort

(7)接到一个信号并终止

(8)最后一个线程对取消请求做出响应

void exit(int status);
void _Exit(int status);
void _exit(int status);

这三个函数用于终止一个程序:_exit和_Exit立即进入内核,exit则先执行一些清理处理(执行一个标准I/O库的清理关闭操作:为所有打开流调用fclose函数,这会造成所有缓冲的输出数据都被冲洗,写到文件上),然后进入内核。

三个exit函数都带有一个整型参数,称为终止状态(参数status)。

main函数返回一整型值与用该值调用exit是等价的。于是在main函数中exit(0)等价于return (0)。

三、环境表

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

extern **environ;

我们称environ;为环境指针,指针数组为环境表,其中各指针指向的字符串为环境字符串。

环境字符串的形式通常如下:

name=value

函数getenv,可以用其取环境变量值:

char* getenv(const char* name);

返回值:指向与name关联的value的指针,若未找到则返回NULL

 注意,此函数返回一个指针,它指向name=value字符串中的value。

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

四、存储器分配

void* malloc(size_t size);
void* calloc(size_t n,size_t size);
void* realloc(void* ptr,size_t newsize);

(1)malloc。分配指定字节数的存储区。此存储区中的初始值不确定。

(2)calloc。为指定数量具指定长度的对象分配存储空间。该空间中的每一位都初始化为0.在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针。

(3)realloc。更改以前分配区的长度(增加或减少)。当增加长度时,可能(关键是看现有存储区后面是否有足够的空间)需要将以前分配区的内容移到另一个足够大的区域,以便在尾端提供增加的存储区,而新增区域区的初始值则不确定。

注意:realloc的最后一个参数时存储区的newsize(新长度),它不是新、旧存储区长度之差。作为一个特例,若ptr是一个空指针,则realloc的功能与malloc相同,用于分配一个指定长度为newsize的存储区。

UNIX环境高级编程——进程环境的更多相关文章

  1. UNIX环境高级编程——进程管理和通信(总结)

    进程管理与通信 进程的管理 进程和程序的区别: 进程: 程序的一次执行过程   动态过程,进程的状态属性会发生变化 程序:存放在磁盘上的指令.数据的有序集合  是个文件,可直观看到 程序program ...

  2. UNIX环境高级编程——进程基本概述

    一.什么是进程 从用户的角度来看进程是程序的一次执行过程.从操作系统的核心来看,进程是操作系统分配的内存.CPU时间片等资源的基本单位.进程是资源分配的最小单位.每一个进程都有自己独立的地址空间与执行 ...

  3. UNIX环境高级编程——进程控制

    一.进程标识符 ID为0的进程是调度进程,常常被称为交换进程.该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程.进程ID 1通常是init进程,在自举过程结束时由内核调用.ini ...

  4. Unix环境高级编程—进程控制(二)

    一.函数wait和waitpid 今天我们继续通过昨天那个死爹死儿子的故事来讲(便于记忆),现在看看wait和waitpid函数. #include<sys/wait.h> pid_t w ...

  5. Unix环境高级编程—进程关系

    终端登录 网络登录 进程组 getpgrp(void) setpgid(pid_t pid, pid_) 会话: 是一个或多个进程组的集合,通常由shell的管道将几个进程编成一组. setsid(v ...

  6. UNIX环境高级编程——进程关系

    一.终端的概念 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们 ...

  7. unix环境高级编程----进程控制wait()

    一.wait()函数 当一个进程中调用wait()函数的时候 (1)假设其全部的子程序都还在执行,则堵塞 (2)假设一个子进程已终止.则等待父进程获取其终止状态. (3)假设没有子进程,则返回错误. ...

  8. Unix环境高级编程—进程控制(三)

    一.解释器文件 解释器文件属于文本文件,起始行形式为: #! pathname[optional-argument] 我们创建一个只有一行的文件如下: #!/home/webber/test/echo ...

  9. UNIX环境高级编程——进程间通讯方法整理

    一.无名管道pipe #include <unistd.h> int pipe(int fd [2]) 二.fifo #include <sys/stat.h> int mkf ...

随机推荐

  1. Vue-起步篇:Vue与React、 Angular的区别

    毋庸置疑,Vue.React. Angular这三个是现在比较火的前端框架.这几个框架都各有所长,选择学习哪种就得看个人喜好或者实际项目了.相比之下, Vue 是轻量级且容易学习掌握的. 1.Vue和 ...

  2. npm下载包很慢和node-sass编译错误的解决办法

    最近研究一个ionic cordova angular2的前端项目 发现npm install下载包非常慢的问题 最近整理了一些解决这些问题的方法. 1.通过config命令修改https为http ...

  3. oracle拆分一个连续的字符串

    create or replace procedure pc(  sss out varchar2)isstr varchar2(20):='ph,p,cod,do,cu';en integer:=i ...

  4. C++ substr

    函数文档:http://www.cplusplus.com/reference/string/string/substr/ /* substr(size_t pos = 0,size_t len = ...

  5. Node.js UDP/Datagram

    稳定性: 3 - 稳定 调用 require('dgram') ,可以使用数据报文 sockets(Datagram sockets). 重要提醒: dgram.Socket#bind() 的行为在 ...

  6. 弹出层之2:JQuery.BlockUI

    JQuery.BlockUI是众多JQuery插件弹出层中的一个,它小巧(原版16k,压缩后10左右),容易使用, 功能齐全,支持Iframe,支持Modal,可定制性高也意味他默认谦虚的外表. jQ ...

  7. RX系列三 | RxJava | create | from | interval | just | range | filter

    RX系列三 | RxJava | create | from | interval | just | range | filter 我们在第一篇里有说过一些基本的关系,现在我们需要用到一些依赖,这里记 ...

  8. Bootstrap3 栅格系统-媒体查询

    在栅格系统中,我们在 Less 文件中使用以下媒体查询(media query)来创建关键的分界点阈值. /* 超小屏幕(手机,小于 768px) */ /* 没有任何媒体查询相关的代码,因为这在 B ...

  9. 《Java多线程编程核心技术》推荐

    写这篇博客主要是给猿友们推荐一本书<Java多线程编程核心技术>. 之所以要推荐它,主要因为这本书写得十分通俗易懂,以实例贯穿整本书,使得原本抽象的概念,理解起来不再抽象. 只要你有一点点 ...

  10. Playground中格式注释语法

    类似于Ruby的ruby document,Xcode的Playground自身也提供一些嵌入文档中的格式注释的语法. 我们先定义一个简单的类: class A{ } 按住opt点击class A,你 ...