【linuxC语言】进程概念与fork

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

在 Linux 系统编程中,进程是计算机中正在执行的程序的实例。每个进程都有自己独立的地址空间、代码段、数据段、堆栈等,使得它们能够彼此独立运行,互不干扰。Linux 系统中的进程是通过进程标识符(PID)来唯一标识的。而在 Linux 中,fork() 是一个非常重要的系统调用,用于创建新的进程。调用 fork() 后,将在原来的进程之上创建一个新的进程,新进程是原进程的一个副本,但具有自己独立的地址空间。本文将探讨进程的概念以及 fork() 函数的用法和作用。


一、进程的概念

想象一下,你正在一边玩游戏,一边听音乐,又同时在浏览网页。这些都是在计算机上运行的程序,而每个程序就像是在计算机上的一个小小的"工作人员",负责执行特定的任务。现在,这些"工作人员"同时在计算机上忙碌地工作,互相之间不干扰,这就好像是计算机上的不同进程一样。

所以,进程就是计算机中正在执行的程序的实例。每个进程都有自己的任务和工作空间,它们之间互相独立,互不干扰。就像是一群工作人员在不同的工作区域里各自忙碌地工作一样。

二、进程基本函数

2.1 fork函数

原型:

c 复制代码
#include <unistd.h>
pid_t fork(void);

作用:

fork() 函数用于创建一个新的进程,新进程是调用进程的一个副本,新进程执行主进程fork下面的代码。父进程调用 fork() 后,会创建一个新的子进程,子进程会复制父进程的地址空间、资源和代码,但有着独立的执行流程。

参数和返回值:

参数:fork() 函数不接受任何参数。

返回值:在父进程中,fork() 返回新创建子进程的 PID,如果创建失败则返回 -1。在子进程中,fork() 返回 0。

2.2 getpid与getppid函数

  1. getpid() 函数:

原型:

c 复制代码
#include <unistd.h>
pid_t getpid(void);

作用:

getpid() 函数用于获取当前进程的 PID(进程标识符)。

参数和返回值:

参数:getpid() 函数不接受任何参数。

返回值:返回当前进程的 PID。

  1. getppid() 函数:
    原型:
c 复制代码
#include <unistd.h>
pid_t getppid(void);

作用:

getppid() 函数用于获取当前进程的父进程的 PID。

参数和返回值:

参数:getppid() 函数不接受任何参数。

返回值:返回当前进程的父进程的 PID。

三、示例代码

c 复制代码
#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid; // 定义进程标识符变量

    pid = fork(); // 调用fork()函数

    if (pid == -1) {
        // 创建子进程失败
        perror("fork");
        return 1;
    } else if (pid == 0) {
        // 子进程代码
        printf("这是子进程,PID:%d\n", getpid());
    } else {
        // 父进程代码
        printf("这是父进程,PID:%d,子进程的PID:%d\n", getpid(), pid);
    }

    return 0;
}

总结

在 Linux 系统中,进程是程序执行的基本单位,每个进程都拥有自己的地址空间和资源。通过 fork() 系统调用,可以在原进程之上创建一个新的进程,新进程是原进程的一个副本。父进程和子进程在调用 fork() 之后都会继续执行,但是它们的执行上下文和返回值不同。父进程会得到子进程的 PID,而子进程的 PID 则为 0。fork() 函数的灵活性使得它成为 Linux 编程中的一个重要工具,可以用于实现并发执行、进程间通信等功能。因此,了解进程的概念和 fork() 函数的用法对于 Linux 系统编程是非常重要的。

相关推荐
忘了ʷºᵇₐ3 小时前
在IDEA 2024.1版本中如何打开Remote Host及连接linux
linux·运维·服务器
零K沁雪4 小时前
Linux 内核中与网络地址相关的函数
linux·内核
0xDevNull5 小时前
Java反射机制深度解析:从原理到实战
java·开发语言·后端
steins_甲乙6 小时前
# 从 0 做一个小型内存泄漏检测器:开篇与架构设计
linux
华科易迅6 小时前
MybatisPlus增删改查操作
android·java·数据库
ALex_zry6 小时前
C++网络编程心跳机制与连接保活:长连接稳定性保障
开发语言·网络·c++
standovon6 小时前
Spring Boot整合Redisson的两种方式
java·spring boot·后端
学嵌入式的小杨同学6 小时前
STM32 进阶封神之路(三十二):SPI 通信深度实战 —— 硬件 SPI 驱动 W25Q64 闪存(底层时序 + 寄存器配置 + 读写封装)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
蒸蒸yyyyzwd6 小时前
后端学习笔记 day4
linux·笔记·学习
IAUTOMOBILE7 小时前
Python 流程控制与函数定义:从调试现场到工程实践
java·前端·python