无涯教程-进程 - 创建终止

news2025/1/14 18:39:14

到现在为止,我们知道无论何时执行程序,都会创建一个进程,并且该进程将在执行完成后终止,如果我们需要在程序中创建一个进程,并且可能希望为其安排其他任务,该怎么办。能做到吗?是的,显然是通过进程创建的,当然,工作完成后,它将自动终止,或者您可以根据需要终止它。

进程创建是通过 fork()系统调用实现的,新创建的进程称为子进程,而启动它的进程(或开始执行时的进程)称为父进程。在fork()系统调用之后,现在我们有两个进程-父进程和子进程。如何区分它们?很简单,就是通过它们的返回值。

System Call

创建子进程后,让我们看到fork()系统调用详细信息。

#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);

创建子进程,此调用之后,有两个进程,现有的一个称为父进程,而新创建的一个称为子进程。

fork()系统调用返回以下三个值之一:

  • 负值  - 表示错误,即创建子进程失败。

  • 0       - 表示为子进程。

  • 正值 - 表示新创建的子进程的进程ID。

让我们考虑一个简单的程序。

File name: basicfork.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
   fork();
   printf("Called fork() system call\n");
   return 0;
}

执行步骤

汇编

gcc basicfork.c -o basicfork

执行/输出

Called fork() system call
Called fork() system call

注意-通常在fork()调用之后,子进程和父进程将执行不同的任务。如果需要运行相同的任务,则对于每个fork()调用,它将运行2次幂n次,其中 n 是fork()被调用的次数。

看到fork()创建了子进程之后,就该查看父进程和子进程的详细信息了。

文件名:pids_after_fork.c

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
   pid_t pid, mypid, myppid;
   pid = getpid();
   printf("Before fork: Process id is %d\n", pid);
   pid = fork();

   if (pid < 0) {
      perror("fork() failure\n");
      return 1;
   }

   //Child process
   if (pid == 0) {
      printf("This is child process\n");
      mypid = getpid();
      myppid = getppid();
      printf("Process id is %d and PPID is %d\n", mypid, myppid);
   } else { //Parent process 
      sleep(2);
      printf("This is parent process\n");
      mypid = getpid();
      myppid = getppid();
      printf("Process id is %d and PPID is %d\n", mypid, myppid);
      printf("Newly created process id or child pid is %d\n", pid);
   }
   return 0;
}

汇编&执行

Before fork: Process id is 166629
This is child process
Process id is 166630 and PPID is 166629
Before fork: Process id is 166629
This is parent process
Process id is 166629 and PPID is 166628
Newly created process id or child pid is 166630

进程可以通过以下两种方式之一终止:

  • 通常在传递某些信号(如终止信号)时发生。

  • 通常,使用_exit()系统调用(或_Exit()系统调用)或exit()库函数。

_exit()和exit()之间的区别主要是清理活动, exit()在将控件返回内核之前会进行一些清理,而 _exit()(或_Exit())会将控件立即返回内核。 

考虑以下带有exit()的示例程序。

文件名称:atexit_sample.c

#include <stdio.h>
#include <stdlib.h>

void exitfunc() {
   printf("Called cleanup function - exitfunc()\n");
   return;
}

int main() {
   atexit(exitfunc);
   printf("Hello, World!\n");
   exit (0);
}

汇编&执行

Hello, World!
Called cleanup function - exitfunc()

考虑以下带有_exit()的示例程序。

文件名称:at_exit_sample.c

#include <stdio.h>
#include <unistd.h>

void exitfunc() {
   printf("Called cleanup function - exitfunc()\n");
   return;
}

int main() {
   atexit(exitfunc);
   printf("Hello, World!\n");
   _exit (0);
}

汇编&执行

Hello, World!

进程 - 创建&终止 - 无涯教程网无涯教程网提供到现在为止,我们知道无论何时执行程序,都会创建一个进程,并且该进程将在执行完成后...https://www.learnfk.com/process/inter-process-communication-process-creation-termination.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/927057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试神器!RunnerGo让你的测试工作更高效!

引言&#xff1a;在软件开发领域&#xff0c;测试是非常重要的一环。然而&#xff0c;传统的测试工具往往复杂且难以使用&#xff0c;让测试工作变得异常繁琐。为了解决这一问题&#xff0c;我们迎来了RunnerGo——一款轻量级、全栈式的测试平台&#xff0c;让你的测试工作更加…

【TI毫米波雷达笔记】UART串口外设配置及驱动(以IWR6843AOP为例)

【TI毫米波雷达笔记】UART串口外设初始化配置及驱动&#xff08;以IWR6843AOP为例&#xff09; 最基本的工程建立好以后 需要给SOC进行初始化配置 int main (void) {//刷一下内存memset ((void *)L3_RAM_Buf, 0, sizeof(L3_RAM_Buf));int32_t errCode; //存放SOC初…

卷积神经网络——中篇【深度学习】【PyTorch】【d2l】

文章目录 5、卷积神经网络5.5、经典卷积神经网络&#xff08;LeNet&#xff09;5.5.1、理论部分5.5.2、代码实现 5.6、深度卷积神经网络&#xff08;AlexNet&#xff09;5.6.1、理论部分5.6.2、代码实现 5.7、使用块的网络&#xff08;VGG&#xff09;5.7.1、理论部分5.7.2、代…

计网第四章(网络层)(二)

目录 IPV4地址编址 第一历史阶段&#xff08;分类编址&#xff09;&#xff1a; A类地址&#xff1a; B类地址&#xff1a; C类地址&#xff1a; D类地址&#xff08;多播地址&#xff09;&#xff1a; E类地址&#xff08;保留地址&#xff09;&#xff1a; 第二历史阶…

懵了,面试官问我Redis怎么测,我哪知道!

有些测试朋友来问我&#xff0c;redis要怎么测试&#xff1f;首先我们需要知道&#xff0c;redis是什么&#xff1f;它能做什么&#xff1f; redis是一个key-value类型的高速存储数据库。 redis常被用做&#xff1a;缓存、队列、发布订阅等。 所以&#xff0c;“redis要怎么测…

数据通信——OSPF基础

一&#xff0c;实验背景 公司盈利了&#xff0c;老总打算扩展公司规模&#xff0c;也发现了RIP协议的缺点带来的影响。身为工程师&#xff0c;老总让你替换更好的网络&#xff0c;顺带为拓展出的新部门进行新的网络部署&#xff0c;甚至买来很多设备。 此时你要用OSPF协议解决问…

推荐系统在线峰会来了,冷启动、推荐工程、模型训练…你都能找到答案

回顾推荐系统的发展历程&#xff0c;从 30 余年前的协同过滤算法起步&#xff0c;经历了深度学习的浪潮&#xff0c;到如今热火朝天的大模型&#xff0c;推荐系统一次又一次地焕发出新的活力。随着大模型的到来&#xff0c;推荐系统正处于变革的前夜&#xff0c;原有的系统模块…

计算机竞赛 基于大数据的时间序列股价预测分析与可视化 - lstm

文章目录 1 前言2 时间序列的由来2.1 四种模型的名称&#xff1a; 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &…

最新Python浪漫520表白代码?

前言 520是每年的5月20日&#xff0c;因数字“520”与“我爱你”发音相似而被许多年轻人用作表达爱意的节日。这个节日起源于中国互联网文化&#xff0c;逐渐传递到其他国家和地区。在这一天&#xff0c;情侣们通常会互送礼物、发表情、或者举行浪漫的活动来庆祝爱情。快来领取…

Unity ProBuilder SetUVs 不起作用

ProBuilder SetUVs 不起作用 &#x1f41f; 需要设置face.manulUV true public static void Set01UV(this ProBuilderMesh mesh){foreach (var face in mesh.faces){face.manualUV true;//设置为手动uv}var vertices mesh.GetVertices().Select(v > v.position).ToArray(…

计算机竞赛 基于图像识别的跌倒检测算法

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于图像识别的跌倒检测算法 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/…

大数据平台安全主要是指什么安全?如何保障?

大数据时代已经来临&#xff0c;各种数据充斥着我们的生活与工作。随着数据的多样性以及复杂性以及大量性&#xff0c;大数据平台诞生了。但对于大数据平台大家都不是很了解&#xff0c;有人问大数据平台安全主要是指什么安全&#xff1f;如何保障&#xff1f; 大数据平台安全…

9.阿里Sentinel哨兵

1.Sentinel Sentinel&#xff08;哨兵&#xff09;是由阿里开源的一款流量控制和熔断降级框架&#xff0c;用于保护分布式系统中的应用免受流量涌入、超载和故障的影响。它可以作为微服务架构中的一部分&#xff0c;用于保护服务不被异常流量冲垮&#xff0c;从而提高系统的稳定…

angular15 数据切换报错

解决方案 1.涉及的属性不要公用&#xff0c;只能有一个标签调用 2.settimeout setTimeout(() > { xxx //导致报错的赋值代码 }, 0);

全新红娘交友系统定制版源码/相亲交友小程序源码

全新红娘交友系统定制版源码&#xff0c;相亲交友小程序源码。定制版红娘交友平台小程序源码&#xff0c;很牛逼的东西&#xff0c;虽然是小程序&#xff0c;但是有700多M大&#xff0c;功能超级强大&#xff0c;还带聊天等功能。 下载地址&#xff1a;https://bbs.csdn.net/t…

Drools的KieSession(有状态会话)的获取,领导就说一句话,员工加班都做不完!

使用Drools规则引擎的代码&#xff0c;最简单的主要有以下几部分&#xff1a; //这一部分的连接&#xff1a;“万恶”之源的KieServices&#xff0c;获取代码就一行&#xff0c;表面代码越少里面东西就越多&#xff0c;本以为就是个简单的工厂方法&#xff0c;没想到里面弯弯绕…

Windows下编译NextCloud desktop 3.9.1

首先从官方下载源码&#xff1a; https://github.com/nextcloud/desktop&#x1f4bb; Desktop sync client for Nextcloud. Contribute to nextcloud/desktop development by creating an account on GitHub.https://github.com/nextcloud/desktop 我选择的是3.9.1的稳定版本…

工控机引领移动机器人的智能化革命!

随着制造业数字化转型的加速&#xff0c;工业4.0时代的到来&#xff0c;工业互联网逐步成为中国推进新型工业化进程的核心驱动力量。而工控机作为工业互联网领域的重要组成部分&#xff0c;已经在越来越多行业得到广泛应用。据中商情报网数据显示&#xff0c;2022年我国工业自动…

Linux CentOS7系统,抓取http协议的数据包

使用 tcpdump 命令 1.首先确认是否安装 [rootlocalhost ~]# which tcpdump /usr/bin/which: no tcpdump in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) [rootlocalhost ~]#我这里没有安装 1.1 安装 tcpdump yum install tcpdump 安装成功如下&#xf…

【Linux】进程间通信原理与Reactor模式

一、用户进程缓冲区和内核缓冲区 缓冲区的目的&#xff0c;是为了减少频繁的系统IO调用。大家都知道&#xff0c;系统调用需要保存之前的进程数据和状态等信息&#xff0c;而结束调用之后回来还需要恢复之前的信息&#xff0c;为了减少这种损耗时间、也损耗性能的系统调用&…