进程操作

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.mzph.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

有人在远程使用计算机是什么意思,如何远程控制计算机,计算机远程控制有什么用途...

对于每个人来说&#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电池没有电了。解决方法…

句子相似度--余弦相似度算法的实现

1、余弦相似度余弦距离&#xff0c;也称为余弦相似度&#xff0c;是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。余弦值越接近1&#xff0c;就表明夹角越接近0度&#xff0c;也就是两个向量越相似&#xff0c;这就叫"余弦相似性"。 上图两…

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

一、集群概念&#xff1a;集群&#xff1a;提高性能&#xff0c;降低成本&#xff0c;提高可扩展性&#xff0c;增强可靠性&#xff0c;任务调度室集群中的核心技术。集群作用:保证业务不断 集群三种网络&#xff1a;业务网络,集群网络,存储网络 二、集群三种类型&#xff1a;…

按季度分类汇总_2019年纯碱行业相关上市公司季报 与半年报情况汇总

2019年纯碱行业相关上市公司季报与半年报情况汇总经百川盈孚统计&#xff0c;目前纯碱行业相关上市公司共计11家(包含三家ST股)&#xff0c;已经全部公布2019年一季度报告。2019年上半年度报告仅五家公司公布&#xff0c;其中包含&#xff1a;大连大化、山东海化、华昌化工、湖…

sapmto生产模式配置及操作详解_硬岩制砂线怎么设计?300t/h的生产流程与设备配置详解...

点击上方“蓝字”关注我们说到硬岩&#xff0c;花岗岩、辉绿岩都不陌生&#xff0c;关于花岗岩的生产线配置小编曾介绍过&#xff0c;感兴趣的可直接点阅&#xff1a;《硬质岩破碎很发愁&#xff1f;从原料到成品&#xff0c;看花岗岩的破碎制砂生产线配置》《年产300万t花岗岩…

公交卡软件测试思路,中国移动NFC专用SIM卡测试过程介绍

近期&#xff0c;通讯运营商在NFC的应用领域迈出了一大步&#xff0c;消费者在北京乘坐地铁、公交以及其他支持市政一卡通消费的场所均可进行手机支付。接下来就从办卡开始&#xff0c;为大家详细介绍一下中国移动NFC手机钱包的实测过程。办理手机NFC支付业务想要刷手机消费除了…

青年教师大讲堂 计算机,浙海大青年教师大讲堂之船机学院“知识改变命运”...

原标题&#xff1a;浙海大青年教师大讲堂之船机学院“知识改变命运”10月28日上午&#xff0c;由校团委主办&#xff0c;船舶与机电工程学院团委承办的青年博士教师大讲堂系列活动之“知识改变命运”在长峙校区杨存国一号报告厅举行。本次讲座由船舶与机电工程学院青年博士石学…

深入浅出分布式文件系统MogileFS集群

一&#xff0c;简介 MogileFS是一款开源的分布式文件存储系统&#xff0c;由LiveJournal旗下的Danga Interactive公司开发。Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前MogileFS的日益成熟使用此解决方法的公司越来越多&#xff0c;例如日…

计算机的控制面板打不开,控制面板打不开,教您控制面板打不开怎么办

最近有些不少的小伙伴向小编反映说&#xff0c;控制面板突然出现了打不开的情况&#xff0c;那么遇到这种情况该怎么办呢&#xff1f;其实控制面板打不开很有可能是因为系统文件损坏造成的。今天&#xff0c;小编就来把打不开控制面板的解决方法分享给你们。其实控制面板是我们…

【算法题】Multiples of 3 and 5

Multiples of 3 and 5 原题 题意如下&#xff1a; 找出N以内的3和5的倍数的和。 思路 1、刚看到觉得好弱智&#xff0c;直接遍历一遍不就OK了吗&#xff1f;但是第2和第3个测试用例报了TLE&#xff0c;超时。 2、然后想不出来了&#xff0c;搜了一下&#xff0c;发现有一个类似…

PIL简单图片处理(上)

自己看了下python&#xff0c;本来想照教程上一点一点学的&#xff0c;学了一会发现好没劲&#xff08;教程本身质量很好&#xff09;&#xff0c;学python就是为了好玩&#xff0c;为什么还这么按部就班勒&#xff1f;果断google下python的爬虫&#xff08;开始目的是这个&…

方舟服务器制作修改,ARK方舟:生存进化服务器禁止物品制造的修改方法

ARK方舟:生存进化服务器禁止物品制造的修改方法代码对应的文件目录:文件:Game.ini框架:[/script/shootergame.shootergamemode]例如禁用C4遥控器代码为:ConfigOverrideItemCraftingCosts(ItemClassString"PrimalItem_WeaponC4_C",BaseCraftingResourceRequirements((…

SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

SQL Server 2008空间数据应用系列四&#xff1a;基础空间对象与函数应用 原文:SQL Server 2008空间数据应用系列四&#xff1a;基础空间对象与函数应用友情提示&#xff0c;您阅读本篇博文的先决条件如下&#xff1a; 1、本文示例基于Microsoft SQL Server 2008 R2调测。 2、具…

c .net ajax,Asp.net mvc 2中使用Ajax的三种方式

在Asp.net MVC中&#xff0c;我们能非常方便的使用Ajax。这篇文章将介绍三种Ajax使用的方式&#xff0c;分别为原始的Ajax调用、Jquery、Ajax Helper。分别采用这三种方式结合asp.net mvc去实现一个史上最简单的留言板。首先看一下原始的Ajax的调用的:定义CommentController&am…