创建进程函数fork的使用

2023-11-01

1.pid_t fork(void);

作用:创建一个新的进程
返回值:如果调用成功,返回两次。返回值为0,代表当前进程是子进程;返回值为非负数,代表当前进程为父进程。调用失败,返回-1

C程序一开始,就会产生一个进程,当这个进程执行到fork()的时候,会创建一个子进程;此时父进程和子进程是共存的,它们俩会一起向下执行C程序的代码;

注意:子进程创建成功后,fork是返回两个值,一个代表父进程,一个代表子进程:代表父进程的值是一串数字,这串数字是子进程的ID(地址);代表子进程的值为0
#include <stdio.h>
#include <unistd.h>
 
 
int main(){
 
        pid_t pid;
 
        printf("pid = %d\n",getpid());
 
        pid = fork();
 
        if(pid > 0 ){
 
                printf("this is father pid:%d\n",getpid());
 
        }else if(pid == 0){
 
                printf("this is child pid:%d\n",getpid());
        }
 
        return 0;
}

执行结果:

2、证明fork()函数,返回值为什么有两个值?

  • fork返回值大于0时,说明当前进程是父进程,这时fork的返回值是子进程的retpid值

  • 然后把fork的返回值retpid,拷贝一份给到子进程,并且把子进程的retpid赋值为0

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

int main()
{
    pid_t pid;
    pid_t pid2;
    pid_t retpid;

    pid = getpid();

    printf("before fork: pid=%d\n",pid);

    retpid = fork();

    pid2 = getpid();
    printf("after fork: pid=%d\n",pid2);

    if(pid == pid2){

             printf("this is father print: retpid=%d\n",retpid);

     }else{

             printf("this is child print: retpid=%d,child pid=%d\n",retpid,getpid());
     }

     return 0;

                                                                                                                              

执行结果:

3.进程创建发生了什么事

旧版本的Linux拷贝方法:全拷贝,有啥拷啥

新版本的Linux拷贝方法:写实拷贝,写的时候才拷贝(改原文件哪里了,就拷贝哪里,没改的地方,实施共享原则)

全拷贝代码举例:

#include <stdio.h>
#include <unistd.h>
 
int main(){
 
        pid_t pid;
        int data = 100;
 
        printf("pid = %d\n",getpid());
 
        pid = fork();
 
        if(pid > 0 ){
 
                printf("this is father pid:%d\n",getpid());
 
        }else if(pid == 0){
 
                printf("this is child pid:%d\n",getpid());
                data = data + 10;
        }
 
        printf("data = %d\n",data);
        return 0;
}

执行结果:

4.fork创建一个子进程的一般目的

  • 一个父进程希望复制自己,使父进程与子进程同时执行不同的代码段。例如网络进程中,父进程等待客户端的服务请求,请求到达时,调用fork,子进程对请求进行处理,父进程则继续等待下一个请求。

  • 一个进程中要执行不同的程序。子程序从fork返回后立即调用exec。

#include <stdio.h>
#include <unistd.h>
 
int main(){
 
        pid_t pid;
        int data;
        while(1){
 
                printf("please input a data :\n");
                scanf("%d",&data);
 
                if(data == 1)
                  {
 
                        pid = fork();
                        if(pid > 0 )
                        {
 
                        }
                        else if(pid == 0)
                          {
                                while(1)
                               {
                                        printf("do net request, pid=%d\n",getpid());
                                        sleep(3);
                                }
                        }
 
                }
               else
                {
 
                        printf("wait,do nothing\n");
                }
        }
 
        return 0;
}

执行结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建进程函数fork的使用 的相关文章

  • 将 bash 脚本作为守护进程运行

    我有一个脚本 它每 X 次运行我的 PHP 脚本 bin bash while true do usr bin php f my script php echo Waiting sleep 3 done 我怎样才能将它作为守护进程启动 要从
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径
  • 如何从命令行执行 PHP 代码?

    我想执行单个 PHP 语句 例如if function exists my func echo function exists 直接使用命令行 无需使用单独的 PHP 文件 这怎么可能 如果您要在命令行中执行 PHP 我建议您安装phpsh
  • 从sourceforge下载最新版本

    我正在尝试在 bash 脚本中从 Sourceforge 下载最新版本的graphicsmagick wget q https sourceforge net projects graphicsmagick files latest dow
  • 如何在 Linux 中显示进程状态(阻塞、非阻塞)

    有没有办法查询 Linux 进程表中进程的状态 以便能够演示执行查询时进程是正在运行还是被阻止 我的目标是从进程或程序的 外部 执行此操作 因为我希望从操作系统进程的角度来理解这一点 但欢迎任何想法 这是Python代码阻塞的过程 impo
  • C/C++ with GCC:静态地将资源文件添加到可执行文件/库

    有人知道如何使用 GCC 将任何资源文件静态编译为可执行文件或共享库文件吗 例如 我想添加永远不会改变的图像文件 如果它们改变了 我无论如何都必须替换该文件 并且不希望它们位于文件系统中 如果这是可能的 我认为这是因为 Visual C f
  • 如何从 Linux 命令行打开 Sublime Text 2 文件到选项卡,而不是新窗口

    我有 ST2 设置 这样我就可以执行 sublime file txt 它将在 ST2 窗口中打开 但是我怎样才能让它在当前打开的窗口的新选项卡中打开呢 尝试 Sublime 命令行帮助 subl 帮助 Sublime Text 2 内部版
  • 如何使用 shell 脚本解压所有 .tar.gz?

    我试过这个 DIR path tar gz if ls A DIR 2 gt dev null then echo not gz else tar zxvf path tar gz C path tar fi 如果该文件夹有一个 tar 则
  • 查找当前打开的文件句柄数(不是 lsof )

    在 NIX系统上 有没有办法找出当前正在运行的进程中有多少个打开的文件句柄 我正在从正在运行的进程中寻找在 C 中使用的 API 或公式 在某些系统上 见下文 您可以在 proc pid fd 中对它们进行计数 如果不属于其中之一 请参阅下
  • 并发 I/O - 缓冲区损坏、块设备驱动程序

    我开发块分层设备驱动程序 所以 我拦截WRITE请求并加密数据 并解密数据end bio 例行程序 在处理和READ要求 所以在单流中一切正常 但是 如果尝试同时从两个或更多进程执行 I O 我会遇到缓冲区内容损坏的情况 我没有任何本地存储
  • gnutls_handshake() 失败:握手失败 GIT

    一切都工作正常 但突然我收到错误 致命 无法访问 https 电子邮件受保护 cdn cgi l email protection name repo name git gnutls handshake 失败 握手失败 我在我的计算机和 E
  • 我可以告诉 Linux 不要交换特定进程的内存吗?

    有没有办法告诉 Linux 它不应该将特定进程的内存交换到磁盘 它是一个 Java 应用程序 所以理想情况下我希望有一种方法可以从命令行执行此操作 我知道您可以将全局交换性设置为 0 但这明智吗 您可以通过以下方式执行此操作姆洛克尔 2 h
  • Git - 致命:无法获取当前工作目录?

    When I git clone从回购协议中 我得到 fatal Could not get current working directory No such file or directory 我该怎么办 我检查了服务器并发现 git文
  • 多线程进程的线程ID可以与另一个正在运行的进程的进程ID相同吗?

    我正在尝试找到一种方法来唯一标识多进程环境中的线程 我有一个服务器 它跟踪连接到它的不同进程 其中一些是多线程的 一些不是 为了识别多线程连接中的线程 我使用线程 ID 作为唯一标识符 在任何给定时间最多有 1 个多线程进程连接 我的问题是
  • Pthread互斥锁由不同线程解锁

    一个天真的问题 我之前读到过 MUTEX 只能由锁定它的线程解锁 但我写了一个程序THREAD1锁定 mutexVar 并进入睡眠状态 然后THREAD2可以直接解锁mutexVar做一些操作并返回 gt 我知道每个人都说我为什么要这样做
  • 串口读取未完成

    下面的函数用于在Linux下从串口读取数据 我在调试时可以读取完整的数据 但是当我启动程序时 读缓冲区似乎并不完整 我正确接收了一小部分数据 但缓冲区的其余部分完全正确zero 可能是什么问题呢 int8 t serial port ope
  • 使用 Bash 按进程名称检查 Mac 进程是否正在运行

    如何使用 Bash 脚本中的进程名称检查 Mac OS X 上的进程是否正在运行 我正在尝试编写一个 Bash 脚本 如果进程已停止 它将重新启动进程 但如果进程仍在运行 则不执行任何操作 解析这个 ps aux grep v grep g
  • 从文件中删除包含非英语 (Ascii) 字符的行

    我有一个文本文件 其中包含来自不同语言的字符 例如 中文 拉丁文等 我想删除包含这些非英语字符的所有行 我想包含所有英文字符 a b 数字 0 9 和所有标点符号 我如何使用 awk 或 sed 等 unix 工具来完成此操作 Perl 支
  • 如何将文本数据从 ruby​​ 控制台传递到剪贴板而不保存到文件?

    我试图将我创建的全局变量中包含的数组传递到我的 mac 上的剪贴板中 它很长 所以我不想在控制台上突出显示 复制和粘贴 我想使用嵌入式unix代码 特别是pbcopyMac 笔记本电脑控制台的功能 允许我将文本传递到我的计算机剪贴板中 准备
  • Docker容器内的动态监听端口

    我有一个应用程序 在使用其默认端口建立一些连接后 开始打开 侦听 新的随机端口来处理现有连接 然后删除它们 视频通话 它还在通信协议内交换其IP地址和端口 我能够解决IP地址问题 但仍然无法找到一种方法来动态告诉主机的IPTABLES在Do

随机推荐

  • Cookie与Session之(简单购物车示例)

    Cookie 实际上是一小段的文本信息 客户端请求服务器 如果服务器需要记录该用户状态 就使用 response 向客户端浏览器颁发一个 Cookie 客户端浏览器会把 Cookie 保存起来 当浏览器再请求该网 站时 浏览器把请求的网址连
  • tailwind css_带有Tailwind CSS和Nuxt.js的深色和浅色主题

    tailwind css Dark and light mode support has been a recent trend due to the impact on our eyesight caused by the time sp
  • 软件测试面试题--(含mysql,linux,出现最频繁)

    这些是我觉得会问道 但不限于所有的 我列出一些 但并不是所有 软件测试是一个漫长的过程 这需要我们有耐心 和细心 还有一个好学习和认真的态度去进行 小伙伴们可以通过背诵然后结合自己的陈述去进行完善和结果专业知识去进行解答 一 软件测试基础
  • DOS命令查询局域网内在线电脑IP

    COLOR 0A CLS ECHO Off Title 查询局域网内在线电脑IP send ECHO off setlocal enabledelayedexpansion ECHO 正在获取本机的IP地址 请稍等 for f tokens
  • 自己个人总结,Android Studio 中SVN的使用步骤

    要使用SVN 首先需要下载SVN的软件 在这里需要下载两款软件 第一款是Svn的服务器端 第二款是Svn的客户端 俗称的小乌龟 软件的下载地址 Svn客户端软件的下载 64位 http download csdn net detail la
  • FPGA流水线除法器(Verilog)原理及实现

    FPGA流水线除法器 Verilog 原理及实现 流水线除法器原理 除法器的计算过程如下图所示 计算步骤 假设数值的位宽为N Step1 分别将被除数和除数扩展至原来2倍位宽 2N 被除数在其左边补N位0 除数在其右边补N位0 Step2
  • mac 下 ~/.bash_profile无效

    1 问题 在配置 bash profile时候项目不生效 2 解决思路 我们使用的shell是zsh 不会自动加载 bash profile 而是自动加载 zprofile文件 这里可以在 zprofile文件加上这么一段 if f bas
  • Python学习笔记第五天(Number)

    Python学习笔记第五天 数据类型 Number 数字 支持四种不同的数值类型 Number 类型转换 数学函数 随机数函数 三角函数 数学常量 结束语 数据类型 在Python中 对象是数据的抽象表示 而引用则是指向对象的指针 Pyth
  • AB实验遇到用户不均匀怎么办?—— vivo游戏中心业务实践经验分享

    作者 vivo 互联网数据分析团队 Li Bingchao AB实验是业务不断迭代 更新时最高效的验证方法之一 但在进行AB实验效果评估时需要特别关注 用户不均匀 的问题 稍不注意 产出的研究结论就可能谬以千里 给业务决策带来极大风险 因此
  • 数据库文件扩展名

    不同的数据库扩展名不同 SQL的就是MDF Access数据库的扩展名是 mdb MSSql数据库的扩展名是 mdf Paradox数据库的扩展名是 DB Oracle数据库的扩展名是 DBF dBase数据库的扩展名是 DBF FoxPr
  • ERROR:Dependency ‘mysql:mysql-connector-java:5.1.38‘ not found

    问题描述 报错信息 Dependency mysql mysql connector java 5 1 38 not found 原因分析 settings xml中未添加镜像源 解决方案 在当前maven项目中 右键选择 Maven gt
  • 测试五:使用Charles抓包

    1 安装Charles 我使用的电脑是mac 本文也是记录在mac下如何安装并使用charles抓线上https的包以及普通http的包 官网地址 https www charlesproxy com download charles默认使
  • Data Augmentation techniques in time series domain: A survey and taxonomy

    本文是对 Data Augmentation techniques in time series domain A survey and taxonomy 的翻译 时间序列域的数据增强技术 综述与分类 摘要 1 引言 2 相关工作 3 背景
  • 最大子数组和Python解法

    给你一个整数数组 nums 请你找出一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 子数组 是数组中的一个连续部分 例 输入 nums 2 1 3 4 1 2 1 5 4 输出 6 解释 连续子数组 4 1 2 1 的和最
  • Linux中nginx如何重启、启动与停止/设置开机自启动

    一 启动 usr local nginx sbin nginx c usr local nginx conf nginx conf 启动代码格式 nginx安装目录地址 c nginx配置文件地址 例如 root localhost usr
  • Unity3D性能优化——工具篇

    性能优化是游戏项目开发中一个重要且必须的元素 用户和项目的需求在并且会持续增长 而即便在硬件设备高速发展的今天 游戏特效 画质 场景复杂度的需求也都向着榨干硬件性能的趋势提升 无论研发团队有多么丰富的经验积累 性能优化永远是一个非常棘手而又
  • 操作系统理论知识9

    我的操作系统笔记 第四章 存储器管理 存储器部件 主存 保存进程运行时的程序和数据 寄存器 速度最快 价格昂贵容量不大 一般以字为单位 只要存放指令一次操作的数据就够了 高速缓存 速度快 存放部分内存数据 硬件自动处理 磁盘缓存 内存的一部
  • Quartz概述

    Quartz是开源任务调度框架中的翘楚 它提供了强大的 任务调度机制 Quartz允许开发人员灵活的定义触发器的调度时间表 并可对触发器和任务进行关联映射 此外 Quartz提供了调度运行环境的持久化机制 可以保存并恢复调度现场 即使系统因
  • Photoscan/Metashape 2.0.0中的地面激光扫描处理

    在Metashape 原Photoscan 2 0 0 结构化地面激光扫描和非结构化航空激光扫描都可以使用导入点云 文件 gt 导入 gt 导入点云 命令导入 导入时会保留所有点属性 包括结构化信息 本文讨论以下主题 如何将激光扫描数据导入
  • 创建进程函数fork的使用

    1 pid t fork void 作用 创建一个新的进程 返回值 如果调用成功 返回两次 返回值为0 代表当前进程是子进程 返回值为非负数 代表当前进程为父进程 调用失败 返回 1 C程序一开始 就会产生一个进程 当这个进程执行到fork