加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

何时以及如何创建过程控制块

发布时间:2020-12-16 06:51:15 所属栏目:百科 来源:网络整理
导读:#include stdio.hint main(void){ return 0;} 何时以及如何为上述程序创建过程控制块? 例如,在上述程序进入运行状态之前,内核必须为此进程分配一个pcb. 我在哪里可以找到对内核进行的各种启动系统调用,以便我可以将这些调用跟踪到内核中. 我对上述程序进行
#include <stdio.h>

int main(void)
{
    return 0;
}

何时以及如何为上述程序创建过程控制块?

例如,在上述程序进入运行状态之前,内核必须为此进程分配一个pcb.

我在哪里可以找到对内核进行的各种启动系统调用,以便我可以将这些调用跟踪到内核中.

我对上述程序进行了操作,但我无法得到它.

execve("./a.out",["./a.out"],[/* 42 vars */]) = 0
brk(0)                                  = 0x9aaf000
access("/etc/ld.so.nohwcap",F_OK)      = -1 ENOENT (No such file or      directory)
mmap2(NULL,8192,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0) = 0xb78df000
access("/etc/ld.so.preload",R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache",O_RDONLY)      = 3
fstat64(3,{st_mode=S_IFREG|0644,st_size=112037,...}) = 0
mmap2(NULL,112037,PROT_READ,MAP_PRIVATE,3,0) = 0xb78c3000
close(3)                                = 0
access("/etc/ld.so.nohwcap",F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/i386-linux-gnu/libc.so.6",O_RDONLY) = 3
read(3,"177ELF111331220o1004"...,512) = 512
fstat64(3,{st_mode=S_IFREG|0755,st_size=1462852,1473032,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_DENYWRITE,0) = 0x456000
mprotect(0x5b7000,4096,PROT_NONE)     = 0
mmap2(0x5b8000,12288,MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE,0x161) = 0x5b8000
mmap2(0x5bb000,10760,MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS,0) = 0x5bb000
close(3)                                = 0
mmap2(NULL,0) = 0xb78c2000
set_thread_area({entry_number:-1 -> 6,base_addr:0xb78c28d0,limit:1048575,seg_32bit:1,contents:0,read_exec_only:0,limit_in_pages:1,seg_not_present:0,useable:1}) = 0
mprotect(0x5b8000,PROT_READ)     = 0
mprotect(0x8049000,PROT_READ)    = 0
mprotect(0xa92000,PROT_READ)     = 0
munmap(0xb78c3000,112037)              = 0
exit_group(0)                           = ?

需要一些提示来期待….

解决方法

进程的创建发生在内核空间而非用户空间中,因此您不会在任何用户空间库中找到用于创建特定于进程的事物的代码. (您可以在用户空间库中找到的是.so文件加载器/运行时链接器等)

实际创建的进程发生在系统调用fork()或clone()中.这会导致调用进程分为两个,父进程和子进程.系统调用的返回值将告诉调用进程它们是哪一个.最常见的用法是fork()之后的子进程执行exec()系统调用.这会导致使用调用者资源(文件描述符,环境,用户,组,当前工作目录等)将进程程序替换为新的可执行文件.

如果你操作一个执行shell脚本的shell,你可以看到这个动作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读