【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 系统编程是非常重要的。

相关推荐
Hello-Brand1 分钟前
Java核心知识体系10-线程管理
java·高并发·多线程·并发·多线程模型·线程管理
乐悠小码7 分钟前
数据结构------队列(Java语言描述)
java·开发语言·数据结构·链表·队列
史努比.9 分钟前
Pod控制器
java·开发语言
2的n次方_12 分钟前
二维费用背包问题
java·算法·动态规划
皮皮林55112 分钟前
警惕!List.of() vs Arrays.asList():这些隐藏差异可能让你的代码崩溃!
java
莳光.12 分钟前
122、java的LambdaQueryWapper的条件拼接实现数据sql中and (column1 =1 or column1 is null)
java·mybatis
程序猿麦小七17 分钟前
基于springboot的景区网页设计与实现
java·spring boot·后端·旅游·景区
敲敲敲-敲代码18 分钟前
游戏设计:推箱子【easyx图形界面/c语言】
c语言·开发语言·游戏
weisian15124 分钟前
认证鉴权框架SpringSecurity-2--重点组件和过滤器链篇
java·安全
蓝田~25 分钟前
SpringBoot-自定义注解,拦截器
java·spring boot·后端