UNIX系统编程笔记:3 Unix系统中的进程
程序员文章站
2022-05-07 10:30:53
...
《UNIX系统编程》第三章 笔记
1、进程标识
UNIX用惟一的被称为进程ID的整数值来标识进程。
每个进程还有一个父进程ID,这个父进程ID最初是创建它的那个进程的进程ID。
如果这个父进程终止,进程就由一个系统进程收养,这样父进程ID就总是标识着一个有效的进程。
getpid和getppid函数分别返回进程ID和父进程ID。pid_t是用来表示进程ID的一个无符号整数类型
#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);
UNIX进程有几个向进程传递权限的用户ID和组ID。真实用户ID、真实组ID、有效用户ID、有效组ID
通过将进程的有效用户ID设置为这个普通用户的ID,进程就能创建“好像是”那个用户创建的文件了。
#include <unistd.h>
gid_t getegid(void); 获取有效用户ID
uid_t geteuid(void);
git_t getgid(void);
uid_t getuid(void); 获取真实用户ID
2、进程状态
新建(new) 正在创建
运行(running) 正在执行指令
阻塞(blocked) 等待像IO这样的事件
就绪(ready) 等待分配处理器
完成(done) 结束
3、进程创建与fork
fork创建新的进程,调用进程就成为父进程,被创建的进程就被称为子进程。
fork函数拷贝了父进程的内存映像,这样新进程就会收到父进程地址空间的一份拷贝。
二个进程在fork语句后,都继续执行后面的指令。
#include <unistd.h>
pid_t fork(void);
fork函数的返回值是允许父进程和子进程区别自己并执行不同的代码的关键特征。
fork函数向子进程返回0,并将子进程的进程ID返回给父进程。
fork失败,返回-1并设置errno
进程链
processchain.c
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv) {
int x;
x=0;
fork();
x = 1;
printf("i am process %ld and my x is %d\n",(long)getpid(),x);
return 0;
}
|
创建进程后,有二个独立的进程在执行,每个都有自己的x变量拷贝。由于父进程和子进程的执行是相互独立的,所以它们不会按照锁步(lock setp)来执行代码 ,也不会修改相同的内存单元。每个进程都打印出带有各自进程ID和x值的消息。
4、wait