时光飞逝,转眼已经毕业快2年了,觉得自己学的东西多却不精。对此深深的思考一下,觉得有必要连载unix环境编程文章,以此激励自己学习。在此立贴为证,2天一篇博客从零开始阐述unix的环境编程。

参考书籍UNIX环境高级编程第三版

下一篇UNIX编程基础下:http://www.cnblogs.com/smartxuchao/p/6658060.html

如上图1.1描述的是一个UNIX的体系结构。对于一个Linux的新手上图描述就是几个关键字。但对于一个Linux的高手来说,这个图描述了太多的信息量了。

内核:从严格的意义上来说,可将操作系统理解成一个软件,他控制计算机的硬件资源提供给应用程序运行的环境。其实Linux就是一个内核,它是GNU操作系统的内核。当然我们熟悉的MAC OSX也是GNU操作系统的内核。

系统调用:系统调用是内核对外提供服务一个接口,好比你要操作键盘。肯定有人会说这个知道我们可以通过API函数来操作键盘,你说的没错。但是要记住API函数也就是库函数是建立在系统调用之上的。内核提供的系统调用数目非常有限,到2.6.23版本的内核也不过才达到仅仅325个,但是API函数有那么多。

库函数:就是一个满足POSIX标准的函数集合

Shell:一类的特殊的软件,它是命令解释器。类比window下cmd,它也是通过系统调用方式与内核交互。我们可以通过strace 命令查看 shell命令的实现过程。如strace echo。

总结:系统调用是访问内核的唯一手段,在驱动开发时候会更加深刻的理解系统调用。

登录UNIX

我们登录unix系统的时候,系统做了什么呢?原来在我们输入用户名和密码的时候,系统会在/etc/passwd查找匹配的用户名和密码

如上图依次是用户名:密码(系统已将口令加密到另一个文件):数字用户ID:数字组用户ID:注释码:起始目录:shell程序

总共有6个:号组成的7个字段。哈哈现在明白你的登录过程了吧,知道为什么你的起始目录在/root下了吧;

要注意的地方shell版本很多,要注意观看自己的系统是什么shell

目前比较流行的shell

1./bin/bash

2.  /bin/sh

3.  /bin/ksh

4.  /bin/csh

5.  /bin/tcsh

6.  /bin/dash

我们可以通过如下命令来观看我们正在运行的shell的版本

文件和目录

  1. Unix系统都是从根目录/扩展下来的
  2. 我们创建新目录的时候都出创建2个文件名分别是.和..。.是指向当前目录,..指向上级目录
  3. 文件命名的时候不要出现/和空字符。斜杠是用来分割路径名中各个文件的,空格符则是终止一个路径名

下面我们用C来实现 shell中 ls命令

#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char *argv[])
{
DIR *dp;//目录的描述符
struct dirent *dirp;//目录内容的结构体
if(argc != )
{
printf("please input --help");
return -;
}
if(strcmp(argv[],"--help") == )
{
puts("-a, --all不隐藏任何以. 开始的项目\n \
-A, --almost-all 列出除. 及.. 以外的任何项目\n\
--author 与-l 同时使用时列出每个文件的作者\n\
-b, --escape 以八进制溢出序列表示不可打印的字符\n");
return ;
}
if((dp = opendir(argv[])) == NULL)
perror("can not open %s",argv[]);/判断标准错误的类型
while((dirp = readdir(dp)) != NULL )
printf("%s\n",dirp->d_name);
// printf("Hello world!\n");
return ;
}

我想根据运行结果很容易看出来我们的程序。

输入和输出

1、  文件描述符:通常是一个非负的整数,内核用以表示一个特定的进程正在访问的文件。当内核打开一个现有的文件或创建一个新的文件时返回的一个描述符。在读写的时候可以使用这个描述符

2、  每当运行一个新的程序,所有shell都会为其打开3个描述符,即标准的输入、标准的输出、标准的错误。默认3个描述符都是指向终端的。好比我们运行任意一个c程序,如果出错误,你会在哪儿看到错误提示,对的我们都会在终端看到。同理标准的输入和输出都是在终端。

说的这肯定有疑问这终端可以修改么当然可以的如下

使用标准的ls

可以看得出结果输出在终端上

如何修改成 ls >2.txt,好吧终端上什么也没打印。结果输出到了2.txt中了,cat 2.txt(打开2.txt文件)果然发现了ls命令的结果

程序和进程

1、程序是一个存储在磁盘的目录中的一个可执行文件。内核使用exec函数(7个exec中一个),将程序读到内存并执行

2、程序执行的实例就是进程,每个进程都有一个id叫做pid

3、线程:一个进程通常只有一个任务线程在处理,如果对于一个多个问题的事情,可以使用多个线程去处理,事情将变得异常轻松。一个进程的线程共享同一地址空间,文件描述符,栈等。当然如何区分不同的线程,对,使用线程ID,线程ID只在进程中起作用。

下面是应用程序如何使用exec函数来吊起其他的程序的执行,加深对内核运行程序的理解

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
int main()
{
char buf[];
int i;
pid_t pid;
int status;
printf("cmd:");
memset(buf,'\0',); while(gets(buf))
{ if((pid = fork()) < ){
perror("fork creat error\n");
}else if(pid == ){
if(execlp(buf,buf,(char *) ) < )//运行一个指定的程序
perror("execlp error\n");
exit();
} if((pid = waitpid(pid,&status,)) < )
perror("wait pid error\n"); printf("cmd:"); } return ;
}

本文章为unix环境编程的基础上,涉及到很多知识点都是很简单的描述下,比如线程和进程都会在后期的文章细细的说到。下一遍博客问unix环境编程基础下,继续在宏观上描述unix系统。结合unix环境编程上下再展开将会涵盖unix大多数内容。2017/3/31

下一篇UNIX编程基础下:http://www.cnblogs.com/smartxuchao/p/6658060.html

UNIX基础上的更多相关文章

  1. 在Livemedia的基础上开发自己的流媒体客户端

    一.背景 二.Livemedia框架介绍 1.总体框架 2.客户端框架 2.1 客户端openRTSP流程 2.2增加一种新的媒体 2.2.1增加媒体的format 2.2.2 新媒体需要考虑的问题 ...

  2. UNIX环境高级编程--第一章 UNIX基础知识

    第一章 UNIX基础知识 1.2 UNIX体系结构   从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们将这种软件称为内核(kernel),因为 它相对较小,且 ...

  3. UNIX基础概念

    UNIX基本概念 进程 从用户观点来看:进程是程序的一个执行实例. 从UNIX系统内部来看,是为运行程序提供执行环境的实体,是系统进行资源分配和调度运行的一个单位. 进程有三个特点: 1)进程有一个控 ...

  4. 在Livemedia的基础上开发自己的流媒体客户端 V 0.01

    在Livemedia的基础上开发自己的流媒体客户端 V 0.01 桂堂东 xiaoguizi@gmail.com 2004-10 2004-12 友情申明: 本文档适合已经从事流媒体传输工作或者对网络 ...

  5. 《UNIX环境高级编程》(APUE) 笔记第一章 - UNIX基础知识

    1 - UNIX基础知识 Github 地址 1. 操作系统 可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.通常将这种软件称为 内核 (kernel) .( Linux 是 GN ...

  6. .net在当前日期的基础上加一天

    比如今天是:2015-11-10 18:57:01,在这个基础上加一天,那么就是2015-11-11 18:57:01,代码如下: DateTime now_dt = DateTime.Now; ). ...

  7. 【JavaEE】SSH+Spring Security基础上配置AOP+log4j

    Spring Oauth2大多数情况下还是用不到的,主要使用的还是Spring+SpringMVC+Hibernate,有时候加上SpringSecurity,因此,本文及以后的文章的example中 ...

  8. 在cocos code ide的基础上构建自己的lua开发调试环境

    对于一种语言,其所谓开发调试环境, 大体有以下两方面的内容: 1.开发, 即代码编写, 主要是代码提示.补齐, 更高级一点的如变量名颜色等. 2.调试, 主要是运行状态下断点.查看变量.堆栈等. 现在 ...

  9. Android 工程在4.0基础上混淆

    Android现在对安全方面要求比较高了,我今天要做的对apk进行混淆,用所有的第三方工具都不能反编译,作者的知识产权得到保障了,是不是碉堡了. 一,首先说明我这是在4.0基础上进行的. 先看看pro ...

随机推荐

  1. Angular企业级开发(7)-MVC之控制器

    1.MVC中的控制器 AngularJS的控制器主要为了把模型和视图连接在一起.大多数业务逻辑操作都会放在视图对应的控制器中.当然如果我们能够把业务逻辑放到后端的REST服务中,就可以开发轻量级Ang ...

  2. git文件夹下项目更改ip地址小结

    在我们开发的过程中,经常切换项目IP地址是很正常的,之前弄过一次,没有记住,现在简单的总结下: 找到要切换IP地址的项目,点击鼠标右键,弹出下图: 打开该项目的路径后,双击打开该项目,具体参考自己项目 ...

  3. Extjs form 组件

    1.根类 Ext.form.Basic 提供了,表单组件,字段管理,数据验证,表单提交,数据加载的功能 2.表单的容器 Ext.form.Panel 容器自动关联 Ext.form.Basic 的实例 ...

  4. Kafka 0.10.1.1 特点

    1.Consumer优化:心跳线程可作为后台线程,提交offset,剥离出poll函数 问题:0.10新设计的consumer是单线程的,提交offset是在poll中.本次的poll调用,提交上次p ...

  5. BZOJ ac100题存档

    不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...

  6. IOS8 : UIAlertController

    UIAlertController 和  UIAlertAction 用法: 1. 最简单的提醒视图: 这里我们实现一个最简单的提醒视图,包含1个标题,1行信息,1个按键,按下按键后,什么都不发生: ...

  7. [转]部署Let’s Encrypt免费SSL证书&&自动续期

    最近公司网站要用https,从自己摸索到找到国内的免费证书到选购正式的收费证书,最后老板说:太贵!不要.一脸懵逼的听老板提到Let's Encrypt证书,没办法,用呗.之前是有一些了解,国外发布的一 ...

  8. AlloyTouch之无限循环select插件

    写在前面 当滚动的内容很多,比如闹钟里设置秒,一共有60项.让使用者从59ms滚回01ms是一件很痛苦的事情,所以: 在列表项太多的情况下,我们希望能够有个无限循环的滚动.00ms和01ms是无缝链接 ...

  9. Laravel中间件

    先谈一谈中间件的使用场景,比如路由转到一张页面,我们需要记录用户的cookie,或者检测用户的访问权限,这些操作如果全写在控制器里是不合适的,因为随着业务的扩充,控制器里的业务逻辑会越来越臃肿,难以维 ...

  10. Hibernate一对一外键映射

    Hibernate 一对一外键映射                    ------------------------------                            ----- ...