明天开始学习进程,在以前的单片机开发中,都没有进程这个概念,但从网上了解到,这个东西在操作系统中似乎具有很重要的地位,一定好好学习!

  ——————————————————————————————————————————————————————————————————

  程序(program)是一个普通文件,是为了完成特定任务而准备好的指令序列与数据的集合,这些指令和数据以“可执行映像”的格式保存在磁盘中。例如:hello.c源程序文件经过编译后产生a.out程序,其中a.out文件为可执行镜像格式,Linux的/bin、/sbin、/usr/bin、/usr/sbin目录下保存着诸多的程序文件。

  进程(process)是一个已经开始执行但还没终止的程序实例。Linux系统下使用ps命令可以查看到当前正在执行的进程。每个进程包含有进程运行环境、内存地址空间、进程ID、和至少一个被称为线程的执行控制流等资源。同一个程序可以实例化为多个进程实体。操作系统中所有进程实体共享着计算机系统的CPU、外设等资源。

  Linux系统使用“ps -aux”命令时可观察到进程的当前状态:

  

  每个进程在创建之时,系统都会给它分配一个进程ID,用来辨识当前的进程(PID),比如上图中的1,2,3,4……

  那个名叫init的进程,就是一切进程的母亲,所以她的进程ID是1。

  创建进程的函数,名叫fork,这个函数虽然没有参数,但它的返回值——非常重要。

  一般在调用fork来创建了一个进程后,程序立即会分离出两条完全不干扰的线路,分别运行两个程序,其中一个叫爹进程,一个叫儿进程。

  爹进程和儿进程所运行的代码都是完全一样的,而且所拥有的资源也是完全相同,那么该怎么区别这两个进程呢?就需要用到fork函数的返回值了。

  “fork()函数将运行着的进程分裂出另一个子进程,它通过拷贝父进程的方式创建子进程。子进程与父进程有相同的代码空间、文件描述符等资源”

                                                       

  

  fork函数如果成功创建了进程,那么分别会返回两个大于零的数,对于爹进程来讲,它返回它所创建的那个儿进程的PID,对于儿进程来讲,它会返回零。

  (fork函数会返回两个返回值,而我们对返回值进行判断,便可清晰地分辨出哪个是爹,哪个又是儿!)

  理论知识便到此,下面开始学习这个fork函数的使用。

  

 #include<stdio.h>
#include<unistd.h>
#include<errno.h> void main(void)
{
pid_t pid; pid = fork();
if(pid < )
{
printf("进程创建错误,错误编码:%d.\n",errno);
return;
}
else if(pid == )
{
printf("我是儿子,我叫%d,我爹叫%d.",getpid(),getppid());
}
else
{
printf("我是爹,我叫%d,我儿子叫%d.",getpid(),pid);
} return;
}

  花了几分钟,将代码写完,虽然比较简单,但也能够熟悉fork函数的使用方法了。

  然后写makelove文件。

 EXE=process
SRC=process.c
OBJ=process.o cc=gcc
CFLAG=-g
LCDFLAG= EXE:$(OBJ)
$(cc) $(LCDFLAG) $(SRC) -o $(EXE) OBJ:$(SRC)
$(cc) -c $(SRC) -o $(OBJ) .PHONY:clean
clean:
rm -vfr $(OBJ) $(EXE)

  

  好!现在开始进行编译。

  

  完美编译,没有爆出任何错误和警告。

  下面开始执行!

  等等……代码出现了问题!

  

  他爹都说了,他的名字叫,他儿子的名字叫.但是……这个儿子似乎有点不认他爹啊!

  他的名字叫,这没有错,但为什么他说他的爹成了呢?

  据我所知,这个1所代表的是init进程。

  难道?

  他有奶便是娘?他是个六亲不认的逆子?

  我不相信我手上会写出这么一个不认父亲的混账玩意儿,开始查资料……

  ——————————————————————————————————————————————————————————

  查了半天,终于找到原因了,原来并非是8172不认他爹,其实这也怪我,我还没等他长大,就当着他的面,亲手把他的爹给杀死了!

  为了在这个炎凉的世间活下去,他不得不认贼作父,这也是为了生存啊!!!

  

        else if(pid == )
{
printf("我是儿子,我叫%d,我爹叫%d.",getpid(),getppid());
}
else
{
printf("我是爹,我叫%d,我儿子叫%d.",getpid(),pid);
} return;

  问题出现在这里,由于他爹毕竟是成年人,跑得当然比一个刚出生的婴快,在他儿子还没有反应过来之前,就已经跑完了短暂的一生……

  执行了return语句,学过C语言的同学都知道,如果程序调用的return,那么也就意味这个程序的终止,系统会收回他曾经拥有过的一切,包括名字(PID)。

  现在修改代码,让他爹别死那么快,至少儿子在长大之前。

  

#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h> void main(void)
{
pid_t pid; pid = fork();
if(pid < )
{
printf("进程创建错误,错误编码:%d.\n",errno);
return;
}
else if(pid == )
{
printf("我是儿子,我叫%d,我爹叫%d.\n",getpid(),getppid());
}
else
{
printf("我是爹,我叫%d,我儿子叫%d.\n",getpid(),pid);
} wait(NULL); // 儿子还没长大,我还不能死!不然他该不认我了! return;
}

  在程序中加入了一个wait函数,这个函数相当于是ICU,可以延缓病人的生命,用来等待见自己亲人最后一面,用来等待子进程的结束,如果子进程没有结束,那他心中极度不甘。

  父进程会用尽全身的力气,憋住最后一口气,死死得等在这里,一直等到子进程结束为止。

  直到儿子长大成人,能对祖国和人民作出贡献之后,父亲才不带着悔恨离开这个世界!

  真是令人感动的代码…………

  我已经被感动得流下了眼泪,含着泪,又执行了一遍代码:

  

  终于,儿子在父亲断气之前,亲口喊了一声:“爸爸!我是,我是你的儿子啊!!”

  父亲看着儿子泪眼婆娑的模样,心中再没有了遗憾和留恋,只剩下无限的欣慰……

  “有儿如此,我可以含笑九泉了!”

  

  

  

  

  

Linux学习笔记(7)-进程的更多相关文章

  1. Linux学习笔记(六) 进程管理

    1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...

  2. Linux学习笔记24——进程管道

    一 管道的作用 通常把一个进程的输出通过管道连接到另一个进程的输入. 二 popen和pclose函数 #include <stdio.h> FILE *popen(const char ...

  3. linux学习笔记之进程

    一.基础知识 1:进程. 1,进程ID: 非负整数,具有唯一性. 1)ID=0的进程:调度进程/交换进程.内核的一部分.不执行任何磁盘上的程序. 2)ID=1的进程:init进程. 1-自举结束时,由 ...

  4. linux学习笔记-13.进程控制

    1.查看用户最近登录情况 lastlastlog 2.查看硬盘使用情况 df 3.查看文件大小 du 4.查看内存使用情况 free 5.查看文件系统 /proc 6.查看日志 ls /var/log ...

  5. Linux学习笔记(一) 文件系统

    对于每一个 Linux 学习者来说,了解 Linux 文件系统的结构是十分有必要的 因为在 Linux 中一切皆文件,可以说只有深入了解 Linux 的文件系统,才会对 Linux 有更深刻的理解 L ...

  6. Linux学习笔记(二) 文件管理

    了解 Linux 系统基本的文件管理命令可以帮助我们更好的使用 Linux 系统,以下介绍几个常用的文件管理命令 1.pwd pwd 是 Print Working Directory 的简写,用于显 ...

  7. Linux学习笔记(四) vi编辑器

    一.vi 编辑器 vi 编辑器 (Visual Interface) 是所有 Unix 及 Linux 系统下标准的编辑器,相当于 Windows 系统中的记事本 它有三种模式,分别是: Comman ...

  8. Linux学习笔记(五) 账号管理

    1.用户与组账号 用户账号:包括实际人员和逻辑性对象(例如应用程序执行特定工作的账号) 每一个用户账号包含一个唯一的用户 ID 和组 ID 标准用户是系统安装过程中自动创建的用户账号,其中除 root ...

  9. Linux学习笔记(七) 查询系统

    1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...

  10. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

随机推荐

  1. XUnit - Shared Context between Tests

    原文 单元测试类通常都会有share setup和cleanup的相关代码.xUnit.net根据共享的范围提供了几种share setup和cleanup的方法. Constructor and D ...

  2. 关于java中自增,自减,和拓展运算符的小讨论

    java中运算符很多,但是能深入讨论的不算太多.这里我仅仅以++,*=为例做讨论. 例:++ i=0; i=i++ + ++i;//i=1 i=++i+i++;//i=2 i=i++ -++i;//i ...

  3. Nacl开发

    环境搭建:http://www.bojinxiaozhu.com/2014/0221/80.html http://blog.csdn.net/xoyojank/article/details/814 ...

  4. WebService初学

    作为一个初学者,在遇到新的知识点的时候,搞清这个知识点的名称含义,是有必要的.那什么是WebService呢? 顾名思义,它是一个运行在web上的服务.这个服务通过网络为我们的程序提供服务方法.类似一 ...

  5. Jquery客户端校验——jquery.validate.js

    jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证 ...

  6. H5案例分享:JS手势框架 —— Hammer.js

    JS手势框架 -- Hammer.js 一.hammer.js简介 hammerJS是一个开源的,轻量级的触屏设备javascript手势库,它可以在不需要依赖其他东西的情况下识别触摸,鼠标事件.允许 ...

  7. MySQL 优化MySQL Server

    一.使用show variables 和show status 命令查看MySQL的服务器静态参数值和动态运行状态信息. 二.可以使用 mysqld --verbose --help|more 查看某 ...

  8. 报错注入分析之updatexml注入

    PS:今天元旦,家里打来电话说,今年春节要回老家.心里倍感恐惧.可以清楚的感觉得到父母说话的气息没有底气.大概如同我一样是恐惧吧.加油吧!努力赚钱! 先丢一篇很不错的文章:http://www.moo ...

  9. 大型App要搞的几个系统

    路由模块: 解耦各个业务,统一收敛页面跳转,动态决策跳转实现:   鉴权模块:收敛鉴权项目(比如登录.输入密码.短信验证.扫脸),后台动态控制鉴权项目:   收银台:收敛支付,统一到收银台:   开关 ...

  10. apple常用网址

    https://developer.apple.com/ https://itunesconnect.apple.com/ iTunes Connect Developer Guide https:/ ...