首页 > 系统相关 >Linux 创建子进程

Linux 创建子进程

时间:2023-08-05 18:04:27浏览次数:29  
标签:fork 创建 void pid 线程 Linux 进程 include

@TOC

前言

在计算机科学中,进程(Process)、线程(Thread)和程序(Program)是三个关键概念,它们在操作系统和并发编程中扮演重要角色。


一、进程,线程,程序 区分

程序(Program): 是一系列按照特定顺序编写的指令集合,用于实现特定任务。程序是静态的,通常以文本文件的形式存储在磁盘上。例如,计算器应用程序、游戏软件或者浏览器都是程序的例子。

进程(Process): 是正在执行的程序的实例。它是计算机执行任务的基本单位。进程拥有自己的独立内存空间、程序代码和运行状态,可以同时执行多个进程来完成多个任务。每个进程都是独立运行的,相互之间不会干扰。进程之间可以进行通信,但需要通过特定的机制(例如管道、共享内存)进行交互。

线程(Thread): 是进程内的执行单元,一个进程可以包含多个线程。线程共享进程的内存空间和资源,在同一进程中的多个线程可以同时执行不同的任务,使得多个任务可以并发执行。线程更轻量级,创建和销毁线程的开销比进程小。线程之间可以通过共享内存的方式进行通信,但要注意协调和同步的问题,避免数据竞争和死锁等并发问题。

程序,只占用 磁盘空间。进程是 运行起来的程序,占用内存,cpu 等系统资源。

Linux 创建子进程_子进程

MMU : 内存管理单元。

  • 虚拟地址 和 物理内存 的映射。
  • 设置修改内存的访问级别。

进程的状态: 初始态,就绪态,运行态,挂起态,终止态。

二、创建子进程

  1. fork 函数 : 创建一个子线程。

pid_t 类型表示进程 ID, 但为了表示 -1,它是有符号整数。

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

pid_t fork(void);

Linux 创建子进程_#include_02

返回值:( 成功后 父子 各自返回一个值 ) 失败返回 -1。 成功返回 : 1. 父进程返回子进程 的 ID(非负)2.子进程返回 0 。

  1. 示例代码 创建一个子线程
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
 	pid_t  id;
 	id = fork();

 	if(id == -1)
	{
		printf("fork err\n");
	}
	else if(id == 0)
	{
		printf("This is child.\n");
	}
	else
	{
		printf("This is parent.\n");				//返回子线程的 ID
	}
	printf("-------------------- end.\n");
	return 0;
}

Linux 创建子进程_父进程_03

注意 : 可以看到最后打印出 2 个 end ,这是为什么呢? 因为,当我们调用 fork 函数后,会创建一个子进程,父进程 和 子进程 都会继续向下执行。 在父进程 调用 fork 函数前的代码 子进程不会执行,只会接着继续往下执行。

Linux 创建子进程_子进程_04

三、创建多个进程

1. 获取进程号

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

 pid_t getpid(void);		// 获取当前进程的 进程号
 pid_t getppid(void);		// 获取当前进程父进程的 进程号

2. 循环创建多个进程

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

int main(void)
{
	int i=0;
	for(i=0;i<5;i++)
	{
		if(fork() == 0)						// 如果是子进程,立即跳出,否则子进程也会产生子进程。
		  break;
	}
	if(i == 5)
	{
		printf("This is parent,pid = %d\n",getpid());			// 父进程打印自己进程号
	}
	else
	{
		printf("I am %dth child,pid = %d, parent_pid = %d.\n",i+1,getpid(), getppid());
	}    	
	return 0;
}

可以看到 子进程的父进程号 和 父进程自己进程号 是相等的。

Linux 创建子进程_#include_05

四、进程工具。

1. ps 查看当前进程.

显示所有进程的信息: ps aux

Linux 创建子进程_父进程_06

其中PID为当前进程的ID号 .

2. kill 进程终止.

kill -9 进程号


总结

标签:fork,创建,void,pid,线程,Linux,进程,include
From: https://blog.51cto.com/u_16159289/6976725

相关文章

  • 深入理解线程与进程:概念、特点与区别,附带代码演示
    当今计算机系统中,线程(Thread)和进程(Process)是并发编程中的关键概念。它们对于提高程序的效率和性能至关重要。本篇博客将详细介绍线程和进程的概念、特点以及它们之间的区别,同时通过代码演示来加深理解。1.线程1.1概念线程是操作系统能够进行运算调度的最小单位。一个进程可以包含......
  • 创建一个基于SpringBoot的web项目
    1、使用国内地址创建SpringBoot项目国内地址:https://start.springboot.io/2、项目结构1:Java目录下放Java相关文件2:static目录下放.css.html.js等文件,包括图片之类的3:templates目录下放模板文件4:放SpringBoot主要配置文件3、创建基于SpringBoot的web案例在上面基础之上,进行下......
  • Linux 常用的磁盘命令
    【Linux】与磁盘相关的常用命令(自用)感谢地心引力已于2023-07-0115:33:50修改4415收藏分类专栏:UbuntuLinux文章标签:linux运维服务器版权UbuntuLinux专栏收录该内容38篇文章0订阅订阅专栏本文将详细介绍以下几个常用的命令:df、du、fdisk、mkfs、lsblk、mount、umou......
  • linux select函数详解
    转载:linuxselect函数详解-AlanTu-博客园(cnblogs.com)在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核:     •我们所关心的文件描述符     •对每个描述符,我们所关心的状态。(我们是要想从一个文件描述符中读或者写,还......
  • Linux系统下将java程序开机自启
    Linux系统下将java程序开机自启在Linux环境下,可以通过将Java程序配置为系统服务(systemd服务)来实现开机自启动。使用systemd可以很方便地管理和控制后台服务,包括Java程序。以下是一个简单的步骤来配置Java程序为systemd服务:1.编写启动脚本创建一个脚本文件,用于启动您的Java程序......
  • linux---设置允许流量转发
    linux---设置允许流量转发临时生效:#方法1(必须使用root账户)echo1>/proc/sys/net/ipv4/ip_forward#方法1变种(有sudo权限即可)echo1|sudotee/proc/sys/net/ipv4/ip_forward#方法2sudosysctl-wnet.ipv4.ip_forward=1方法1和方法2效果一样永久生效:修改/et......
  • linux磁盘管理
    1、fdisk-l      查看所有磁盘信息n      创建新分区d       删除分区p       列出分区表w       保存分区表并退出e        扩展分区2、partprobe    刷新分区表3、df-T     ......
  • 随笔(二十六)『SpringBoot + Vue 简单部署到Linux』
    1、安装docker1.1、卸载系统之前的dockersudoyumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\......
  • 【ES】创建索引
    通过Elasticsearch的RESTFulAPI来创建索引:PUThttp://{host}:9200/{index}默认情况下,创建的索引分片数量是5个,副本数量是1个。如果要指定分片数、副本数量:{ "settings":{ "number_of_shards":3, "number_of_replicas":2 }}使用CURL命令curl-XPUT"l......
  • linux怎么查看文件夹多大
    方法:1、利用ls命令查看,该命令可将结果以KB、MB等为单位进行显示,语法为“ls-ll”或“ls-lh”;2、利用“du-h–max-depth=1*”命令,该命令可查看当前目录下的各个文件和文件夹的大小;3、利用“du-sh”命令,可查看当前文件夹的总大小;4、利用“du-h–max-depth=0*”命令,可查看直接......