【Linux系统编程】进程属性--标识符
1.PID
1.1什么是PID?
区分进程的唯一性
1.2如何查看进程?
ps ajx | head -1 ; ps ajx | grep myproc
或者ps ajx | head -1 && ps ajx | grep myproc | grep -v grep(过滤掉grep本身这个进程)
1.3进程有哪两种?
1.执行完就退出,如指令。
2.一直不退,直到用户退出,叫做常驻进程,如杀毒软件。
1.4如何获取当前进程的PID值?进程除了通过系统调用获取PID外,是否还有其他方式得知自己的PID?
获取当前进程pid值可通过系统调用getpid(),它返回一个名为pid的类型值,这是一个系统封装的整数类型(pid_t)。在C语言中,可以直接通过调用该函数来获取进程的pid。
是的,进程可以通过调用getpid()系统调用来获取自身的pid,然后将得到的PID存储在一个变量中,后续需要时直接读取这个变量即可,因为进程的pid在生命周期内通常是不变的,除非进程被重新创建。
1.5PID的主要作用是什么?
PID的主要作用有两点:
一是为了区分不同的进程,就像学校的学号一样,每个进程都需要一个唯一的PID以便系统和用户识别;
二是随着程序的不断启动,PID会随之变化,以记录进程的动态状态变化。
1.6如何终止一个进程?
- ctrl c
- 或者使用命令(另一个窗口输入)"kill -9 进程对应的PID",如kill -9 9793
1.7Linux系统中如何查看进程的详细属性?
在Linux系统中,可以使用ps命令获取进程的部分属性,而对于更多更详细的属性,可以访问根目录下的proc目录下的proc文件夹。其中每个以数字命名的子目录代表一个进程,包含该进程的各种属性文件。
- ls /proc是一个特殊的目录(里面是进程的详细信息)
- /proc不是磁盘级的文件夹,是内存级的。
- 今天把我的电脑关了,这个proc目录就全部给释放掉了,在磁盘上不需要存储proc里面的任何信息,不需要存。
/proc中数字命名的目录
- 数字就是该进程的PID
- 数字目录里面的内容就是该进程中的所有属性
- ps的实现和/proc有关
1.7.1一个例子
ls /proc/1 -l
exe会显示让该进程启动的可执行程序是从磁盘的哪个可执行程序加载来的
cwd就是current work dir即当前工作目录
- 进程的cwd就是当前路径
- chdir("/home/zq")改变工作目录到/home/zq
1.8CWD和EXE这两个属性分别代表什么含义?
CWD表示当前工作目录,记录了进程启动时所在的工作路径;
而EXE则表示可执行文件,即进程加载到内存中的可执行程序文件。
1.81.如果删除了进程对应的可执行程序文件,进程还能正常运行吗?
进程可以继续运行,因为它的可执行程序已经被加载到了内存中。然而,一旦进程结束,由于磁盘上的可执行程序已被删除,该进程将无法再次启动。
1.8.2当前工作目录(CWD)对于新建文件有何影响?
在进程启动时,系统会记录下进程的CWD属性,即进程启动时所在的工作路径。当进程执行创建新文件的操作时,如果未指定文件路径,系统会自动将进程当前的工作路径拼接到文件名前面,从而实现新建文件默认在进程启动时的工作路径下创建。
1.8.3如何更改工作目录?
chdir("/home/zq")改变工作目录到/home/zq
2.PPID
2.1什么是PPID?
- 即父进程的ID
- getppid获取自己的父进程ID(始终不变)
- 在命令行中,执行命令/执行程序,本质是bash这个进程,创建的子进程,由子进程执行我们的代码。
- bash就是命令行解释器,shell是所有命令行解释器外壳程序的统称,而在Linux中一般叫bash。
- 每登录一次xshell,就会有一个-bash(这里的-代表的是我们当前用户是使用我们的命令行终端进行登录的)
2.2创建新进程的机制
在Linux系统中,当启动任何进程时,新创建的进程是由父进程来创建的。
在命令行上启动的所有的进程,其实都是bash来做的。
2.3使用系统调用创建子进程
2.3.1见一见
fork用来创建进程
fork的返回值:给父进程返回子进程的PID,给子进程返回0。
fork函数具有两个返回值的原因:
在Linux系统中,fork函数执行后会创建一个新的子进程,并且子进程和父进程之间共享代码但各自拥有私有的数据空间。父进程在fork后会获得新创建的子进程的PID,而子进程则继承了父进程的代码。因此,fork函数返回两次是因为新创建的子进程需要有一个PID值来标识其独立存在的事实,同时父进程也需要一个PID值以便管理所有子进程。
在多进程编程中,全局变量对于父进程和子进程来说是独立的。父进程对全局变量的修改不影响子进程,反之亦然。即使多个进程同时读取和修改同一全局变量,每个进程看到的都是自己独立的一份数据。
2.3.2解释函数的特点,返回值上,不做理解介绍
fork() 两个进程 父子关系 一般而言,代码是会共享的,但是数据是各自私有一份。
进程之间有很强的独立性,多个进程之间,运行时,互不影响,即便是父子。
代码是只读的,所以可以共享,而数据是可以修改的,为了保持独立性,所以各自私有一份的。
id就是一个变量
返回的本质就是向指定的变量进行写入返回值数据。
打印的本质就是读取。
2.3.3创建多进程demo
myprocess.cc
Makefile
2.3.4理解创建子进程,结合系统接口上
1.一个函数,fork,为什么会有两个返回值?
fork是一个系统调用函数,父子进程各自执行一次return。id的返回值,给父(subpid)子(0)
2.一个变量为什么会有两个不同的值?
因为进程需要独立性
3.是怎么做到的?(暂不回答)
4.fork之后谁先运行不确定,由OS的调度器自主决定。