标签:linux
最近在实习, 公司里面用的电脑系统里面是ubuntu, 之前在学校里也用装过这个系统, 当时也就是试试玩着, 简单地熟悉里面的几个命令而已(ls, cd , mkdir ,就这么多了*_*!)。但是在公司实习已经快四个月,让我对Linux使用有了很大进步,最近觉得自己应该对这个优秀的作品有深入的了解。于是在学校图书馆借了几本关于Linux内核相关的书籍。主要是<<Linux内核设计与实现>>作者是Robert Love,借的时候还有意的选了英文版的, 因为实习的过程当中让我觉得其实看英文原版资料让自己更容易理解一点,尽管时间方面比较的长,许多中文书籍把一些浅显的概念描述的不知所云,就像明明可以用大白话讲清楚,为何要用文言文呢。
今天主要是把自己对进程的一些了解记录下来。
进程这个概念我想计算机专业的学生都能很容易回答上来的问题,它是一个可执行程序在运行时的一种集合, 考试的时候总是喜欢问你 “进程和程序是什么关系?“,这类问题的回答就是一个动态和静态的关系, 我自己简单的理解就是: 程序存在的形态和其他文件都一样,程序这个文件不同之处在于只有操作系统可以识别它,理解它,运行它,这和你用pdf阅读器阅读pdf文档有什么区别呢, 所以程序就是文件。 而进程就是这个程序被操作系统打开后的状态。 类同与文件可以被多个程序打开,所以同一个程序当然也可以被操作系统打开多少次,就像你平常电脑上面登录多个qq号一样,程序还是那个qq.exe,
而运行的进程确实两个。
Linux的进程
Linux当中的进程概念和上面描述的没有什么出入, 我们使用计算机,主要的目的是让它运行我们的程序,而操作系统就是提供你程序运行的环境。Linux的优秀在于它可以很好的管理很多进程,是每个进程的使用效率都很高,而且系统本身很稳定。 这对于那些商业应用很合适。
我就是带着这些理解去尝试Linux系统当中关于进程的关键和管理。
Linux系统当中每个进程都有与之关联的ID号, 行话叫PID(Process ID),设置这个很容易去理解,因为系统要去管理许多进程,它没有必要去知道你是什么名字,它用唯一的数字ID去管理更加方便。
现在我们可以看一下系统的进程(Linux操作系统shell提供ps 命令)
[jiangjian@jiangjian Process]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Dec23 ? 00:00:01 /sbin/init
root 2 0 0 Dec23 ? 00:00:00 [kthreadd]
root 3 2 0 Dec23 ? 00:00:00 [migration/0]
root 4 2 0 Dec23 ? 00:00:01 [ksoftirqd/0]
root 5 2 0 Dec23 ? 00:00:00 [stopper/0]
...
500 20707 20700 0 14:32 ? 00:00:01 sshd: jiangjian@pts/0
500 20708 20707 0 14:32 pts/0 00:00:00 -bash
postfix 20972 2144 0 15:29 ? 00:00:00 pickup -l -t fifo -u
500 21182 20708 0 16:13 pts/0 00:00:00 ps -ef
从上面的输出可以看到当前系统有许多进程。
Linux当中创建进程是通过fork()这个系统调用的, 这个系统调用比较特别(其实也没有那么特别),因为它返回两次(?平常我们的理解是一个调用一次返回,怎么会有两次), 一次是在父进程,另一个在子进程, 来来,让我们仔细想想, 在fork调用后父子程序在此分道扬镳,对于父进程fork()调用需要有返回值, 对于子进程它当然也需要在fork()有返回值 ,因为fork()系统调用后,父子进程会使用同一个进程地址,所以父子进程运行的是同一个程序代码,那么怎么区分父子进程呢?所以只有在fork()这个系统调用上面动点歪脑筋了......,根据不同的返回值来区分, 父进程返回子进程pid, 子进程返回0, 原来也不是那么的神秘,至于父进程为什么返回子进程PID也很容易理解啊, 他得知道他的孩子是那个对不?(因为系统可能有其他程序也在创建子进程)而PID就是进程的唯一身份证明。
下面来了解一下吧。
#include<stdio.h> #include<sys/types.h> #include<unistd.h> int main() { pid_t pid; printf("Now we are in main function, and pid is %d\n", getpid()); printf("We will fork child process\n"); pid = fork(); if (pid == 0) { printf("I am child process, and My pid is %d and ppid is %d\n", getpid(), getppid()); printf("child process is exiting\n"); return 0; }else { printf("I am father process, and My pid is %d and child process pid is %d\n",getpid(), pid); } return 0; }
[jiangjian@jiangjian Process]$ ./a.out
Now we are in main function, and pid is 21224
We will fork child process
I am father process, and My pid is 21224 and child process pid is 21225
I am child process, and My pid is 21225 and ppid is 1
child process is exiting
[jiangjian@jiangjian Process]$
这应该可以简单的了解吧。
标签:linux
原文地址:http://blog.csdn.net/heiyouhei123/article/details/42214317