簡體   English   中英

何時以及如何創建過程控制塊

[英]When and how a process control block is created

#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, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220o\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1462852, ...}) = 0
mmap2(NULL, 1473032, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x456000
mprotect(0x5b7000, 4096, PROT_NONE)     = 0
mmap2(0x5b8000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x161) = 0x5b8000
mmap2(0x5bb000, 10760, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x5bb000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 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, 8192, PROT_READ)     = 0
mprotect(0x8049000, 4096, PROT_READ)    = 0
mprotect(0xa92000, 4096, PROT_READ)     = 0
munmap(0xb78c3000, 112037)              = 0
exit_group(0)                           = ?

需要一些提示來期待....

進程的創建發生在內核空間而非用戶空間中,因此您不會在任何用戶空間庫中找到用於創建特定於進程的事物的代碼。 (您可以在用戶空間庫中找到的是.so文件加載器/運行時鏈接器等)

實際創建的進程發生在系統調用fork()或clone()中。 這會導致調用進程分為兩個,父進程和子進程。 系統調用的返回值將告訴調用進程它們是哪一個。 最常見的用法是fork()之后的子進程執行exec()系統調用。 這會導致使用調用者資源(文件描述符,環境,用戶,組,當前工作目錄等)將進程程序替換為新的可執行文件。

如果你操作一個執行shell腳本的shell,你可以看到這個動作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM