進程操作

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

一、創建一個進程

進程是系統中最基本的執行單位。Linux系統允許任何一個用戶進程創建一個子進程,創建之后,子進程存在于系統之中并獨立于父進程。

關于父進程與子進程這兩個概念,除了0號進程以外(由系統創建),Linux系統中任何一個進程都是由其它進程創建的。創建新進程的進程,即調用fork()函數的進程就是父進程。

Linux中使用fork()函數創建一個新進程,函數原型如下:

#include <unistd.h>
pid_t fork(void);

fork()函數不需要參數,返回值是一個進程ID。對于返回值,有以下3中情況:

  • 對于父進程,fork()函數返回新創建的子進程的ID。
  • 對于子進程,fork()函數返回0.由于系統的0號進程是內核進程,所以子進程的進程號不可能是0,由此可區分父進程和子進程。
  • 如果出錯,fork()函數返回-1.

fork()函數會創建一個新的進程,并從內核中為此進程得到一個新的可用進程ID。之后為這個新進程分配進程空間并將父進程的進程空間中的內容復制到子進程空間中,包括父進程的數據段和堆棧段,并且和父進程共享代碼段。

由于復制了父進程的堆棧段,所以兩個進程都停留在fork()函數中,等待返回。因此,fork()函數會返回兩次,一次是在父進程中返回,另一次是在子進程中返回,兩次的返回值是不一樣的。

下面示例創建一個子進程:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc, char *argv[])
{pid_t pid;pid = fork();if(pid < 0) {  //fork出錯printf("fail to fork.\n");exit(1);} else if(pid == 0) {  //子進程printf("this is child, pid is : %u\n", getpid());} else {printf("this is parent, pid is : %u, child-pid is %u\n", getpid(), pid);}return 0;
}

運行結果:

?

二、父子進程的共享資源

子進程完全復制了父進程的地址空間的內容,包括堆棧段和數據段的內容。子進程并沒有復制代碼段,而是和父進程共用代碼段。

下面的實例定義了一個全局百變量、一個局部變量和一個指針。之后該程序創建一個子進程,在子進程中修改上面定義的值,并打印出來。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int global;  //全局變量,在數據段中int main(int argc, char *argv[])
{pid_t pid;int stack = 1;  //局部變量,在棧中int *heap;heap = (int *)malloc(sizeof(int));  //動態分配的內存,在堆中*heap = 2;pid = fork();if(pid < 0) {printf("fail to fork\n");exit(1);} else if(pid == 0) {  //子進程global++;stack++;(*heap)++;printf("the child, data: %d, stack: %d, heap: %d\n", global, stack, *heap);exit(0);  //子進程結束}sleep(2);  //父進程休眠2秒printf("the parent, data: %d, stack: %d, heap: %d\n", global, stack, *heap);return 0;
}

運行結果:

?

三、創建一個共享空間的子程序

進程在創建一個新的子進程之后,子進程的地址空間完全和父進程分開,父子進程是兩個完全獨立的進程,接受系統調度和分配系統資源的機會均等。如果父子進程共用父進程的地址空間,則子進程就不是獨立于父進程的。Linux下提供了一個和fork()函數類似的函數,可以用來創建一個共用父進程地址空間的子進程,函數原型如下:

#include <unistd.h>
pid_t vfork();

vfork()和fork()函數的區別如下:

  • vfork()函數產生的子進程和父進程完全共享地址空間,包括代碼段、數據段和堆棧段,子進程對這些資源所做的修改可以影響父進程。vfork()函數產生的進程更像一個線程。
  • vfork()函數產生的子進程一定比父進程先運行,即父進程調用vfork函數后,會等待子進程運行后再運行。

使用vfork()函數還應注意不要在非main函數的函數中調用vfork()函數。

?

四、退出進程

當一個進程需要退出時,需要調用退出函數:

#include <stdlib.h>
void exit(int status);

exit()函數的參數表示退出的狀態,這個狀態的值是一個整型。在shell中可以檢查這個退出的狀態值。

C程序中的return語句會被翻譯為調用exit()函數:

return 1;
翻譯為:
exit(1);

exit()函數與內核函數的關系

exit()函數是一個標準的庫函數,其內部封裝了Linux系統調用的_exit()函數。兩者的主要區別在于exit()函數會在用戶空間做一些善后工作,例如清理用戶的I/O緩沖區將其內容寫入磁盤文件等,之后再進入內核釋放用戶進程的地址空間;而_exit()函數直接進入內核釋放用戶進程的地址空間,所以用戶空間的緩沖區內容都將丟失。

?

五、設置進程所有者

每一個進程都有兩個用戶ID,實際用戶ID和有效用戶ID。通常這兩個ID的值是相等的,其值為進程所有者的用戶ID。但是有些場合需要改變進程的有效用戶ID。

Linux下使用setuid()函數改變一個進程的實際用戶ID和有效用戶ID,其函數原型如下:

#include <unistd.h>
int setuid(uid_t uid);

setuid()函數的參數表示改變后的新用戶ID,如果成功修改當前進程的實際用戶ID和有效用戶ID,setuid()函數返回0,失敗返回-1。

兩種用戶可以修改進程的實際用戶ID和有效用戶ID:

  • 根用戶。根用戶可以將進程的實際用戶ID和有效用戶ID更改。
  • 其他用戶,且該用戶的用戶ID等于進程的實際用戶ID或者保存的ID。

下面的程序演示修改當前進程的用戶ID:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc, char *argv[])
{FILE *fp;uid_t uid, euid;uid = getuid();  //實際用戶IDeuid = geteuid();  //有效用戶IDprintf("the uid is : %d\n", uid);printf("the euid is : %d\n", euid);if(setuid(8000) == -1){perror("fail to set uid");exit(1);}printf("after changing\n");uid = getuid();  //實際用戶IDeuid = geteuid();  //有效用戶IDprintf("the uid is : %d\n", uid);printf("the euid is : %d\n", euid);return 0;
}

運行結果:

Linux下還提供只修改有效用戶ID的函數:

int seteuid(uid_t uid);

以及修改實際組ID和有效組ID的函數:

#include <unistd.h>
int setgid(gid_t gid);
int setegid(gid_t gid);

?

轉載于:https://my.oschina.net/daowuming/blog/795026

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397310.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397310.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397310.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機硬件發展的特點有哪些,簡述計算機的發展歷程及各代計算機的特點。

滿意答案Karen0491推薦于 2017.11.25采納率&#xff1a;40% 等級&#xff1a;6已幫助&#xff1a;608人世界上第一臺計算機是1946年問世的&#xff0c;根據計算機的性能和軟硬件技術&#xff0c;將計算機發展劃分成以下幾個階段&#xff1a;①第一階段&#xff1a;電子管計算…

電餅鍋的樣式圖片價格_進口琺瑯鑄鐵鍋專場,精致小廚娘們來康康!

兩個月前&#xff0c;小灰兔我寫了《10個高顏值居家好物&#xff0c;讓你在朋友圈萬眾矚目&#xff01;》一文&#xff0c;曾有小伙伴私信說這張圖簡直就是夢想中廚房的亞子強烈同意&#xff01;&#xff01;&#xff01;有多少女孩子&#xff0c;看到顏值炒雞高的鍋路都走不動…

在UITouch事件中畫圓圈-iOS8 Swift基礎教程

這篇教程主要內容展示如何利用Core Graphics Framework畫圓圈,當用戶點擊屏幕時隨機生成不同大小的圓,這篇教程在Xcode6和iOS8下編譯通過。 打開Xcode,新建項目選擇Single View Application,Product Name填寫iOS8SwiftDrawingCirclesTutorial,Organization Name和Organization …

瀏覽器兼容性問題

轉載于:https://www.cnblogs.com/python-machine/p/9406084.html

sql server 2005 (select查詢語句用法)

select * from userInfo where age like 2[25]功能&#xff1a;查詢userInfo表中age字段&#xff0c;所有以2開頭&#xff0c;且第二位是2或5的記錄。select * from userInfo where name like _娜_功能&#xff1a;查詢userInfo表中name&#xff08;char(6)&#xff09;字段所有…

有人在遠程使用計算機是什么意思,如何遠程控制計算機,計算機遠程控制有什么用途...

對于每個人來說&#xff0c;計算機都是至關重要的家用電器. 因為使用計算機可以使我們的業余生活豐富多彩. 隨著Internet的普及&#xff0c;越來越多的用戶開始學習自己使用計算機. 但是&#xff0c;操作中仍然存在很多問題&#xff0c;只要每個人都學會了遠程控制&#xff0c;…

圖學java基礎篇之IO

java io體系 如圖可以看出&#xff0c;java的io按照包來劃分的話可以分為三大塊&#xff1a;io、nio、aio&#xff0c;但是從使用角度來看&#xff0c;這三塊其實揉雜在一起的&#xff0c;下邊我們先來概述下這三塊&#xff1a; io:主要包含字符流和字節流&#xff0c;我們常用…

boot界面上下鍵調節鍵不能動_為什么電腦一開機就自動進入BIOS界面

電腦故障的問題表現形式很多&#xff0c;比如說為什么電腦藍屏&#xff0c;為什么電腦一開機就自動進入BIOS界面等。這些問題往往另很多網友不知所措。今天小編就針對電腦一開機就自動進入BIOS界面的問題&#xff0c;教下大家具體的解決方法。1、你的BIOS電池沒有電了。解決方法…

ArcEngine數據刪除幾種方法和性能比較

轉自原文 ArcEngine數據刪除幾種方法和性能比較 一、 幾種刪除方法代碼 1. 查詢結果中刪除 private void Delete1(IFeatureClass PFeatureclass) { IQueryFilter pQueryFilter new QueryFilterClass(); pQueryFilter.WhereClause "objectID<" DeleteNum; IFe…

計算機組成原理中英對照篇,信息科學系課程介紹(中英對照).doc

文檔介紹&#xff1a;信息科學系課程介紹(中英對照)序號:1課程編碼:14001010課程名稱:計算機基礎學分:1周學時:2開課系部:信息科學系預修課程:無修讀對象:信息管理與信息系統專業本科生課程簡介:主要介紹計算機發展歷史、常用操作系統、辦公和其它應用軟件、等內容。通過本課程…

句子相似度--余弦相似度算法的實現

1、余弦相似度余弦距離&#xff0c;也稱為余弦相似度&#xff0c;是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。余弦值越接近1&#xff0c;就表明夾角越接近0度&#xff0c;也就是兩個向量越相似&#xff0c;這就叫"余弦相似性"。 上圖兩…

python之模塊calendar(匯集了日歷相關的操作)

# -*- coding: utf-8 -*- #python 27 #xiaodeng #calendar日歷模塊import calendar#3個大類&#xff1a; calendar.Calendar(firstweekday0) calendar.TextCalendar(firstweekday0) calendar.HTMLCalendar(firstweekday0)#返回某月日歷 cal calendar.month(2011, 11) print ca…

紅帽436——HA高可用集群之概念篇

一、集群概念&#xff1a;集群&#xff1a;提高性能&#xff0c;降低成本&#xff0c;提高可擴展性&#xff0c;增強可靠性&#xff0c;任務調度室集群中的核心技術。集群作用:保證業務不斷 集群三種網絡&#xff1a;業務網絡,集群網絡,存儲網絡 二、集群三種類型&#xff1a;…

計算機網絡的構成教學反思,《計算機網絡知識》教學反思.doc

文檔介紹&#xff1a;《計算機網絡知識》教學反思本課時以理論性內容為主,在日常教學過程中往往會以課本宣讀為主,很難引起學生的學****興趣。然而在教學中若能夠合理的采用多種教學方式,做到理論聯系實際,將達到良好的教學效果。我在本節課教學中,以我校的校園網為模型,充分利…

按季度分類匯總_2019年純堿行業相關上市公司季報 與半年報情況匯總

2019年純堿行業相關上市公司季報與半年報情況匯總經百川盈孚統計&#xff0c;目前純堿行業相關上市公司共計11家(包含三家ST股)&#xff0c;已經全部公布2019年一季度報告。2019年上半年度報告僅五家公司公布&#xff0c;其中包含&#xff1a;大連大化、山東海化、華昌化工、湖…

抖音C#版,自己抓第三方抖音網站

感謝http://dy.lujianqiang.com技術支持 文章更新&#xff1a;http://dy.lujianqiang.com這個服務器已經關了&#xff0c;現在沒用了 版權歸抖音公司所有&#xff0c;該博客只是為交流學習所使用,編譯后的內容將24小時內刪除 該程序所獲取到的內容或視頻歸Beijing Microlive Vi…

linux命令-vim命令模式

編輯模式下 按 “esc” 進去命令模式 &#xff1a;wq 保存并退出 &#xff1a;w 保存 已寫入 &#xff1a;q&#xff01;不保存強制退出 &#xff1a;wq&#xff01; 強制保存退出 &#xff1a;set nu 顯示行號 &#xff1a;set nonu 去掉行號 &#xff1a;nohl 取消高亮 /字…

ai在計算機教學中的應用,淺談人工智能在教育中的應用

淺談人工智能在教育中的應用孫立友摘要&#xff1a;隨著人工智能技術的進步&#xff0c;以及研究的深入和在教育領域的逐步推廣&#xff0c;對教育領域產生了深遠的影響。人工智能對于彌補當前教育存在的種種缺陷和不足&#xff0c;推動教育發展改革和教學現代化進程起著越來越…

TCP 和 UDP

TCP/IP五層網絡結構模型 物理層&#xff1a;物理層建立在物理通信介質的基礎上&#xff0c;作為系統和通信介質的接口&#xff0c;用來實現數據鏈路實體間透明的比特 (bit) 流傳輸。只有該層為真實物理通信&#xff0c;其它各層為虛擬通信 數據鏈路層:在物理層提供比特流服務的…

sapmto生產模式配置及操作詳解_硬巖制砂線怎么設計?300t/h的生產流程與設備配置詳解...

點擊上方“藍字”關注我們說到硬巖&#xff0c;花崗巖、輝綠巖都不陌生&#xff0c;關于花崗巖的生產線配置小編曾介紹過&#xff0c;感興趣的可直接點閱&#xff1a;《硬質巖破碎很發愁&#xff1f;從原料到成品&#xff0c;看花崗巖的破碎制砂生產線配置》《年產300萬t花崗巖…