进程创建:fork函数

2024-08-24 02:52
文章标签 函数 创建 进程 fork

本文主要是介绍进程创建:fork函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

fork函数

在Linux系统中,fork函数是用于创建一个新的进程的函数。调用fork函数会创建一个新的进程。

fork函数的原型如下:

#include <unistd.h>pid_t fork(void);

fork函数没有参数,返回值是一个pid_t类型的值。在成功创建新的进程后,fork函数会在父进程中返回子进程的PID,而在子进程中返回0。如果fork函数调用失败,则会返回-1。

它返回两个不同的值:

  • 在父进程中,fork 返回新创建子进程的进程 ID (PID)。
  • 在子进程中,fork 返回 0。

如果 fork 调用失败,则在父进程中返回 -1,并设置 errno 以指示错误原因。

调用fork函数后,父进程和子进程会有相同的代码、数据和堆栈。但是,父进程和子进程是两个独立的进程,它们有各自独立的地址空间。

以下是一个简单的示例代码:

#include <stdio.h>#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {// fork 失败perror("fork failed");return 1;} else if (pid == 0) {// 子进程printf("子进程\n");} else {// 父进程printf("父进程。 子进程的PID: %d\n", pid);}return 0;}

1.创建子父进程,子进程将1.txt内容拷贝到2.txt中,父进程将3.txt内容拷贝到4.txt中。

#include <myhead.h>int copy_child()
{FILE *fp1,*fp2;fp1=fopen("./3.txt","r");if(fp1==NULL){perror("fp1");return -1;}fp2=fopen("./4.txt","w");if(fp2==NULL){perror("fp2");return -1;}char buff[100];printf("文本3内容:\n");while(fgets(buff,sizeof(buff),fp1) !=NULL){printf("%s",buff);fputs(buff,fp2);}fclose(fp1);fclose(fp2);printf("\n");printf("拷贝成功\n");printf("\n");printf("文本4内容\n");char buff2[100];fp2=fopen("./4.txt","r");if(fp2==NULL){perror("fp2");return -1;}while(fgets(buff2,sizeof(buff),fp2) !=NULL){printf("%s",buff2);}printf("\n");fclose(fp2);
}int copy_par()
{FILE *fp1,*fp2;fp1=fopen("./1.txt","r");if(fp1==NULL){perror("fp1");return -1;}fp2=fopen("./2.txt","w");if(fp2==NULL){perror("fp2");return -1;}char buff[100];printf("文本1内容:\n");while(fgets(buff,sizeof(buff),fp1) !=NULL){printf("%s",buff);fputs(buff,fp2);}fclose(fp1);fclose(fp2);printf("\n");printf("拷贝成功\n");printf("\n");printf("文本2内容\n");char buff2[100];fp2=fopen("./2.txt","r");if(fp2==NULL){perror("fp2");return -1;}while(fgets(buff2,sizeof(buff),fp2) !=NULL){printf("%s",buff2);}printf("\n");fclose(fp2);}int main(int argc, const char *argv[])
{pid_t ID;ID=fork();int flag=0;if(ID>0){printf("父进程\n");flag=1;}else if(ID==0){printf("子进程\n");flag=2;}else{perror("fork");return -1;}if(flag==1){copy_child();}else if(flag==2){copy_par();}else{printf("拷贝失败\n");return -1;}return 0;
}

这篇关于进程创建:fork函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101248

相关文章

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

python中update()函数的用法和一些例子

《python中update()函数的用法和一些例子》update()方法是字典对象的方法,用于将一个字典中的键值对更新到另一个字典中,:本文主要介绍python中update()函数的用法和一些... 目录前言用法注意事项示例示例 1: 使用另一个字典来更新示例 2: 使用可迭代对象来更新示例 3: 使用

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注

MySQL的触发器全解析(创建、查看触发器)

《MySQL的触发器全解析(创建、查看触发器)》MySQL触发器是与表关联的存储程序,当INSERT/UPDATE/DELETE事件发生时自动执行,用于维护数据一致性、日志记录和校验,优点包括自动执行... 目录触发器的概念:创建触www.chinasem.cn发器:查看触发器:查看当前数据库的所有触发器的定

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.