进程的所有信息记录在/proc/ 文件夹内的进程pid对应文件内(都在内存中,不在磁盘),有的是文件夹,有的是文件。(实时更新的,进程都有)(关联ps命令(做/proc/的文本分析))
进程属性记录在task_struct内
1.标识符pid是根据进程创建时,其余进程数量分配的。用处:标识进程。
关联:pid_t getpid()<unistd.h>系统调用(用程序请求操作系统内核提供服务的一种机制)接口
2.当前工作目录:CWD。是进程文件的所在路径。用处:方便进程根据相对路径找文件等。(如在当前目录下创建文件....txt)
关联:int chdir(const char*)
3.进程所属用户UID。用处:可以用于执行时判断权限(如普通用户在系统根目录创建文件权限不够)
4.ppid父进程的pid。
关联:pid_t getppid(); pid_t fork();给父进程返回子进程的pid,给子进程返回0,创建失败返回给父进程-1.
任何进程都是父进程创建的,执行命令行指令也是由bash创建(bash创建子进程可以子进程出问题不影响自己)
问题:1.进程正在执行,将它对应的可执行程序删掉会去掉进程吗?
不会,进程被加载到内存了,删磁盘的不影响内存
补充:
编译器有的会警告没有使用的变量,可以之后加一个(void)变量;强转而不赋值
一个父进程可创建多个子进程(linux进程是树形结构)(例:IDE的语法检测实际不断调用编译器)
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
pid_t id=fork();
if(id>0)
{
printf("创建成功,我是父进程\n");
}
else if(id==0)
{
printf("创建成功,我是子进程\n");
}
else{}
return 0;
}
父进程创建子进程:
先创建(拷贝,调整)子进程的PCB,再让子进程共享父进程的代码,但资源不共享(进程独立性),->变量值不共享.fork内创建完子进程后,父进程和子进程分别执行return语句(return时,核心任务已经完成),所以会返回两个不同的值,两者继续执行后面代码,进不同判断。(数据各私有一份)
fork之后子进程和父进程谁先运行取决于调度器。