前面我们学习了gdb的一些基础命令,今天来看看进程这个概念。
进程 = 对应的代码和数据 + 进程对应的 PCB 结构体
那么问题来了,PCB是什么?
难道是高中生物?错辣!那是PCR
PCB全称Process Control Block,即 进程管理块
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
Linux操作系统下的PCB是: task_struct
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
进程的信息可以通过 /proc 系统文件夹查看
[wkj@VM-4-13-centos lesson8]$ ls /proc/1
ls: cannot read symbolic link /proc/1/cwd: Permission denied
ls: cannot read symbolic link /proc/1/root: Permission denied
ls: cannot read symbolic link /proc/1/exe: Permission denied
attr cgroup comm cwd fd io map_files mountinfo net oom_adj pagemap projid_map schedstat smaps statm task wchan
autogroup clear_refs coredump_filter environ fdinfo limits maps mounts ns oom_score patch_state root sessionid stack status timers
auxv cmdline cpuset exe gid_map loginuid mem mountstats numa_maps oom_score_adj personality sched setgroups stat syscall uid_map
[wkj@VM-4-13-centos lesson8]$ ls /proc
1 1199 14040 20 24 259 27737 294 414 6411 7 925 cmdline execdomains kallsyms locks pagetypeinfo stat uptime
10 12 147 203 24085 26 27884 36 47 646 7301 990 consoles fb kcore mdstat partitions swaps version
10753 1217 16 21 25 260 28 37 49 65 8 991 cpuinfo filesystems keys meminfo sched_debug sys vmallocinfo
10968 13 1621 22 25007 26695 28826 38 50 650 8234 993 crypto fs key-users misc schedstat sysrq-trigger vmstat
11 13814 18 22268 25089 27 28850 389 51 654 8236 acpi devices interrupts kmsg modules scsi sysvipc xpmem
1162 1389 19 22269 251 27052 289 39 52 657 8349 buddyinfo diskstats iomem kpagecount mounts self timer_list zoneinfo
1166 1390 19897 22270 257 271 29 4 557 658 8350 bus dma ioports kpageflags mtrr slabinfo timer_stats
1175 14 2 23 258 277 293 410 6 659 9 cgroups driver irq loadavg net softirqs tty
#include
#include
#include
int main()
{
printf("pid: %d\n", getpid());
printf("ppid: %d\n", getppid());
return 0;
}
#include
#include
#include
int main()
{
int ret = fork();
if(ret < 0){
perror("fork");
return 1;
}
else if(ret == 0){ //child
printf("I am child : %d!, ret: %d\n", getpid(), ret);
}
else{ //father
printf("I am father : %d!, ret: %d\n", getpid(), ret);
}
sleep(1);
return 0;
}
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
ps aux / ps axj 命令
一个进程已经退出,但是还不允许被操作系统(OS)释放,处于一个被检测的状态,这个状态就是僵尸状态。
维持该状态,为了让父进程和OS来进行回收。
我是一个进程,如果我退出了,没有人来读我的数据,我就是僵尸!
父进程退出,子进程还在,子进程就叫做孤儿进程。孤儿进程会被领养,被1号进程领养(init,系统本身),这样就可以进行回收。
#include
#include
#include
int main()
{
pid_t id = fork();
if(id < 0){
perror("fork");
return 1;
}
else if(id == 0){//child
printf("I am child, pid : %d\n", getpid());
sleep(10);
}else{//parent
printf("I am parent, pid: %d\n", getpid());
sleep(3);
exit(0);
}
return 0;
}
以上就是今天要讲的内容啦