Jadual Kandungan
程序执行时,main函数是如何被调用的,命令行参数是如何传递给程序的,典型的存储空间布局是什么样式,如何分配其他存储空间,进程如何使用环境变量,进程的终止等等这些都是进程控制的基础知识。
进程的启动和终止
进程终止的情况
进程启动和终止图
atexit函数
exit函数
_e(E)xit函数
ISO C 定义这个函数的目的是为进程提供一种无需运行终止处理程序或信号处理函数的方法而终止程序。但ISO C 对标准I/O流是否进行冲洗,这取决于操作系统的实现。在unix中,是不进行冲洗的。
exit和_e(E)ixt函数的状态码
wait和waitpid函数
环境表和环境变量
环境表结构图
环境变量
这些函数如何修改环境表的
内存存储结构补充说明
内存管理结构图
存储空间分配函数
函数间跳转策略
寄存器变量会存在回滚现象的探究

进程环境--进程管理

Jul 23, 2017 am 11:16 AM
persekitaran proses

程序执行时,main函数是如何被调用的,命令行参数是如何传递给程序的,典型的存储空间布局是什么样式,如何分配其他存储空间,进程如何使用环境变量,进程的终止等等这些都是进程控制的基础知识。


进程的启动和终止

内核执行c程序时,利用exec函数调用一个特殊的启动例程,该启动例程丛内核中获取命令行参数和环境变量值。

进程终止的情况

5种正常终止的情况:

(1)从main函数返回;
(2)调用exit;
(3)调用_exit和_Exit函数;
(4)最后一个线程调用pthread_exit;
(5)最后一个线程从其启动例程返回;
Salin selepas log masuk

3种异常终止情况

(1)调用abort;
(2)接到一个信号;
(3)最后一个线程对取消请求做出响应;
Salin selepas log masuk

进程启动和终止图

进程启动和终止图

atexit函数

一个进程最多可以登记32和函数(例如:signal函数),这些函数由exit函数自动调用。在程序终止时调用这些函数,形成终止处理程序,来进行结束进程前的收尾工作。而exit函数通过atexit函数的登记记录来判断调用哪些函数。

exit函数

此函数由ISO C 定义,其操作包括处理终止处理程序,然后关闭所有标准I/O流。需要注意的是,它不会处理文件描述符、多进程(父子进程)以及作业控制。

_e(E)xit函数
ISO C 定义这个函数的目的是为进程提供一种无需运行终止处理程序或信号处理函数的方法而终止程序。但ISO C 对标准I/O流是否进行冲洗,这取决于操作系统的实现。在unix中,是不进行冲洗的。

exit和_e(E)ixt函数的状态码

无论进程怎样结束,它都会在内核上执行同一段代码(由进程启动和退出图可知)。这段代码来关闭所有的文件描述符,释放所有的存储空间。

程序退出后,利用退出码告知该进程的父进程。父进程通过wait或waitpid函数来完成该子进程的善后工作(获取子进程相关信息 释放子进程占用资源)。若父进程没有处理子进程的退出状态,则子进程变成僵死进程。相反的,若父进程在子进程前终止,则子进程变成孤儿进程。孤儿进程会由1号进程(init进程)接收,大致过程如下:

(1)进程终止时,内核逐个检查所有活动的进程;
(2)分析查找该终止进程的子进程;
(3)将该进程的子进程的父进程ID改为1;
Salin selepas log masuk

wait和waitpid函数

程序正常或异常终止时,内核都会向父进程发送SIGNAL信号。子进程终止是异步事件,所以该信号也是异步信号。而该信号一般会被父进程默认忽略。或者提供一个信号处理函数来善后。wait和waitpid函数就是其中的信号处理函数的一部分。

wait和waitpid函数区别如下:

(1)wait会阻塞调用者进程等待直至第一个终止的子进程到来;
(2)waitpid可以通过参数设置,来实现调用者进程不阻塞,或选择要阻
塞等待的子进程;
Salin selepas log masuk

这里的调用者指的是父进程

环境表和环境变量

环境表结构图

环境表结构

  • 每个程序都接收到一张环境表

  • 环境表也是一个字符指针数组

  • enrivon叫做环境指针

  • 指针数组叫做环境表

  • 各个指针指向的字符串叫做环境字符串

环境变量

  • unix内核并不检查环境字符串,它们的解释完全取决于各个应用进程

  • 通常在一个shell启动文件中设置环境变量来控制shell的动作

  • 修改或者增加环境变量时,只能影响当前进程以及其后(之前的不行)生成和调用的任何子进程的环境,但不能影响其父进程的环境

和环境变量相关的函数如下:

#include<stdlib.h>
char *getenv(const char *name);
      返回值:指向与name关联的value的指针;若未找到,返回NULL

int putenv(char *str);
                       返回值:若成功,返回0;若出错,返回非0
                       
int setenv(const char *name, const char *value,
            int rewrite);
int unsetenv(const char *name);
                两个函数返回值:若成功,返回0;若出错,返回-1
Salin selepas log masuk

这些函数如何修改环境表的

环境表和环境字符串通常存放在内存空间的高地址处(顶部)。所以在修改它的值时,内存是不能继续向高地址延伸;但又因为,它之下是各个栈帧,所以也不能向下延伸。如何修改它的值的过程如下:

(1)修改环境表

1)新value <= 旧value,直接覆盖旧value的存储空间
2)新value >= 旧value,调用malloc函数,在堆区开辟新的存储空间,
将新value复制到这里,再将这片存储区首地址写到环境表相应的位置处。
Salin selepas log masuk

(2)新增环境表

1)新增一个环境变量,调用malloc函数开辟新的存储空间,将原来的环
境表复制到该存储区,其次再添加一个环境变量,然后在尾部赋值为NULL,
最后将environ指向该区域;
2)在 1)过程的基础上,调用realloc函数,多次添加环境变量;
Salin selepas log masuk

注意:以这种方式修改的环境变量只在当下程序运行时有效,当程序结束时,相应的存储区被系统回收,这些修改就会失效。

内存存储结构补充说明

内存管理结构图

存储空间结构

  • 未初始化数据段(block started by symbol):在程序开始执
    行之前,内核将此段中的数据初始化为0或空指针;

  • 栈:每次函数调用时,其返回地址以及调用者的环境信息(如某些机器寄存器的值)都存放在栈中;

  • 共享库:只需在所有进程都可引用的存储区中保存这种库例程的一个副本;

存储空间分配函数

#include<stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nojy, size_t size);
void *realloc(void *ptr, size_t newsize);
         3个函数返回值:若成功,返回非空指针;若出错,返回NULL
Salin selepas log masuk
  • malloc函数:初始值不确定;底层通过调用sbrk函数实现;

  • calloc函数:初始值为0;

  • realloc函数:增加或减少以前分配区的长度;当增加长度时,可能将以前分配区的内容移到另一个足够大的区域,以便在分配区末尾增加存储区,而新增存储区初始值不确定(例如:可变数组的使用);

注意:这些动态分配的函数一般在分配存储空间时,会比要求的大。因为在开辟空间的前后部分存储记录管理信息。因此,在使用时,千万不要越界访问,以免造成不可预知的后果。

函数间跳转策略

在c语言中,goto语句是不能跨函数跳转的。尤其是在函数深层调用时的跳转需求,在出错处理的情况下非常有用。

#include<setjmp.h>
int setjmp(jmp_buf env);
          返回值:若直接调用,返回0;若从longjmp返回,返回非0
void longjmp(jmp_buf env, int val);
Salin selepas log masuk

变量值回滚问题:自动变量和寄存器变量会存在回滚现象。利用volatile属性来避免此类情况的发生。(在给变量赋值时,赋的值回首先存储在内存(存储器变量)中,然后在由cpu取走,存储在cpu的寄存器上(寄存器变量)。在做系统优化时,那些频繁使用的变量,会直接存储到寄存器中而不经过内存。)

寄存器变量会存在回滚现象的探究

在调用setjmp函数时,内核会把当前的栈顶指针保存在env变量中,所以在调用longjmp函数返回该位置时,全局变量、静态变量、易失变量和自动变量如果在调用setjmp和longjmp函数之间它们的值被修改过,是不会回滚到setjmp函数调用之前的值(当然,编译器将auto变量优化为寄存器变量除外)。因为,这些存储器变量的值是存储在内存相应的段中,回到原先栈顶状态时,同样访问的还是原先的内存空间。

然而,对于寄存器变量来说,首先要明确一点:寄存器变量是用动态存储的方式。意思是寄存器变量的值可能存在不同的寄存器中。如果在调setjmp和longjmp函数之间它们的值被修改过,这个值可能不会存到setjmp之前的对其赋值的寄存器中,而在调用longjmp函数后,又回到了调用setjmp函数时的状态。这个时候再读取寄存器变量的值时,读到的是原先那个寄存器中存储的值而不是修改过的那个寄存器中存储的值,所以出现的回滚现象。

Atas ialah kandungan terperinci 进程环境--进程管理. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Terangkan apakah proses explorer.exe Terangkan apakah proses explorer.exe Feb 18, 2024 pm 12:11 PM

Apakah proses explorer.exe? Apabila kita menggunakan sistem pengendalian Windows, kita sering mendengar istilah "explorer.exe". Jadi, adakah anda ingin tahu apakah proses ini? Dalam artikel ini, kami akan menerangkan secara terperinci apakah proses explorer.exe dan fungsi serta kesannya. Pertama sekali, explorer.exe ialah proses utama sistem pengendalian Windows Ia bertanggungjawab untuk mengurus dan mengawal Windows Explorer (Window

Apakah proses com pengganti? Apakah proses com pengganti? Sep 14, 2022 pm 02:56 PM

"com pengganti" ialah proses "C:\Windows\System32\dllhost.exe"; bertindak balas secara langsung. Ini kerana komputer sedang memuatkan ikon fail Kadangkala masalah berlaku, menyebabkan komputer tersekat Anda boleh menyelesaikan masalah tersekat dalam tetapan sifat komputer.

Apakah jenis proses ccsvchst.exe? Apakah jenis proses ccsvchst.exe? Feb 19, 2024 pm 11:33 PM

ccsvchst.exe ialah fail proses biasa yang merupakan sebahagian daripada perisian Symantec Endpoint Protection (SEP), dan SEP ialah penyelesaian perlindungan titik akhir yang dibangunkan oleh syarikat keselamatan rangkaian terkenal Symantec. Sebagai sebahagian daripada perisian, ccsvchst.exe bertanggungjawab untuk mengurus dan memantau proses berkaitan SEP. Pertama, mari kita lihat SymantecEndpointProtection(

Tidak dapat boot ke dalam persekitaran pemulihan Windows Tidak dapat boot ke dalam persekitaran pemulihan Windows Feb 19, 2024 pm 11:12 PM

Persekitaran Pemulihan Windows (WinRE) ialah persekitaran yang digunakan untuk membaiki ralat sistem pengendalian Windows. Selepas memasuki WinRE, anda boleh melakukan pemulihan sistem, tetapan semula kilang, menyahpasang kemas kini, dsb. Jika anda tidak dapat boot ke WinRE, artikel ini akan membimbing anda melalui pembetulan untuk menyelesaikan isu tersebut. Tidak dapat boot ke dalam Persekitaran Pemulihan Windows Jika anda tidak boleh but ke dalam Persekitaran Pemulihan Windows, gunakan pembetulan yang disediakan di bawah: Semak status Persekitaran Pemulihan Windows Gunakan kaedah lain untuk memasuki Persekitaran Pemulihan Windows Adakah anda secara tidak sengaja memadam Pembahagian Pemulihan Windows? Lakukan peningkatan di tempat atau pemasangan bersih Windows di bawah, kami telah menerangkan semua pembaikan ini secara terperinci. 1] Semak Wi

Apakah perbezaan antara Python dan Anaconda? Apakah perbezaan antara Python dan Anaconda? Sep 06, 2023 pm 08:37 PM

Dalam artikel ini, kita akan belajar tentang perbezaan antara Python dan Anaconda. Apakah Python? Python ialah bahasa sumber terbuka yang memberi penekanan yang besar untuk menjadikan kod mudah dibaca dan difahami dengan menginden baris dan menyediakan ruang kosong. Fleksibiliti dan kemudahan penggunaan Python menjadikannya sesuai untuk pelbagai aplikasi, termasuk tetapi tidak terhad kepada pengkomputeran saintifik, kecerdasan buatan dan sains data, serta mencipta dan membangunkan aplikasi dalam talian. Apabila Python diuji, ia segera diterjemahkan ke dalam bahasa mesin kerana ia adalah bahasa yang ditafsirkan. Sesetengah bahasa, seperti C++, memerlukan kompilasi untuk difahami. Kemahiran dalam Python adalah kelebihan penting kerana ia sangat mudah difahami, dibangunkan, dilaksanakan dan dibaca. Ini menjadikan Python

Bagaimana untuk membunuh proses zombi dengan betul di Linux Bagaimana untuk membunuh proses zombi dengan betul di Linux Feb 19, 2024 am 10:40 AM

Dalam sistem Linux, proses zombi adalah proses khas yang telah ditamatkan tetapi masih kekal dalam sistem. Walaupun proses zombi tidak menggunakan banyak sumber, jika terlalu banyak, ia boleh menyebabkan kehabisan sumber sistem. Artikel ini akan memperkenalkan cara mengalih keluar proses zombi dengan betul untuk memastikan operasi normal sistem. Proses zombi 1Linux Selepas proses anak menyelesaikan tugasnya, jika proses induk tidak menyemak status dalam masa, proses anak akan menjadi proses zombi. Proses anak sedang menunggu pengesahan daripada proses induk, dan sistem tidak akan mengitar semulanya sehingga ia selesai. Jika tidak, proses zombi akan terus tergantung dalam sistem. Untuk menyemak sama ada terdapat proses zombi dalam sistem, anda boleh menjalankan arahan atas untuk melihat semua proses yang sedang berjalan dan kemungkinan proses zombi. Hasil daripada arahan 'atas' boleh dilihat dari rajah di atas dalam Linux.

Penjelasan terperinci tentang kaedah pelarasan keutamaan proses Linux Penjelasan terperinci tentang kaedah pelarasan keutamaan proses Linux Mar 15, 2024 am 08:39 AM

Penjelasan terperinci tentang kaedah pelarasan keutamaan proses Linux Dalam sistem Linux, keutamaan proses menentukan susunan pelaksanaannya dan peruntukan sumber dalam sistem. Melaraskan keutamaan proses secara munasabah boleh meningkatkan prestasi dan kecekapan sistem. Artikel ini akan memperkenalkan secara terperinci cara melaraskan keutamaan proses dalam Linux dan memberikan contoh kod khusus. 1. Gambaran keseluruhan keutamaan proses Dalam sistem Linux, setiap proses mempunyai keutamaan yang berkaitan dengannya. Julat keutamaan biasanya -20 hingga 19, di mana -20 mewakili keutamaan tertinggi dan 19 mewakili

Bagaimana untuk menghentikan kemas kini proses Pengurus Tugas dan mematikan tugas dengan lebih mudah dalam Windows 11 Bagaimana untuk menghentikan kemas kini proses Pengurus Tugas dan mematikan tugas dengan lebih mudah dalam Windows 11 Aug 20, 2023 am 11:05 AM

Cara Menjeda Kemas Kini Proses Pengurus Tugas dalam Windows 11 dan Windows 10 Tekan CTRL+Kekunci Tetingkap+Padam untuk membuka Pengurus Tugas. Secara lalai, Pengurus Tugas akan membuka tetingkap Proses. Seperti yang anda lihat di sini, semua apl bergerak tanpa henti dan sukar untuk menunjukkannya apabila anda ingin memilihnya. Jadi, tekan CTRL dan tahan, ini akan menjeda pengurus tugas. Anda masih boleh memilih aplikasi dan juga tatal ke bawah, tetapi anda mesti menahan butang CTRL pada setiap masa.

See all articles