参考: 1.博客1:https://www.pianshen.com/article/4305691855/ fork:在原进程的基础上"分叉"出一个子进程,即创建一个子进程. NAME fork - create a child process SYNOPSIS #include <unistd.h> pid_t fork(void); DESCRIPTION fork() creates a new process by duplicating the calling…
参考资料: 1.博客1:https://blog.csdn.net/zhou1021jian/article/details/71531699 2.博客2:https://blog.csdn.net/weixin_40039738/article/details/81145247 本文主要介绍下面函数的用法和代码示例 pthread_create 创建线程 pthread_exit 终止线程 pthread_join 回收进程 pthread_detach 线程分离 pthread_attr_s…
前言: Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication). 常用的进程间通信方式有: ① 管道 (使用最简单) ② 信号 (开销最小) ③ 共享映射区 (无血缘关系) ④ 本地套接字…
当使用fork创建多个进程后,需要解决子进程回收的问题.wait和waitpid函数就是做这个工作的. 假设子进程没有合理的回收,可能会带来两个问题: 1.孤儿进程(父进程挂了,子进程活着),孤儿进程会被init进程回收,可以理解其没有危害,不会占用资源. 2.僵尸进程(子进程挂了,父进程活着),僵尸进程是当父进程活着时,子进程没有其他进程帮忙回收后产生的"有害进程",所以僵尸必须要回收,否则僵尸进程太多了会占用系统资源.此时就需要用到wait或waitpid函数. wait和wait…
参考资料: 1.博客1:https://www.jianshu.com/p/755338d11865 mmap:一种内存映射文件的方法 memory map 父子进程和无亲缘关系的进程,都可以将自身用户空间映射到同一个文件或匿名映射到同一片区域,实现进程间通信. 函数原型: #include <sys/mman.h> 创建映射: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 释…
学习大概就是不断迭代.重构的过程,不复习的学习是不负责任的,亦是无用的. 本系列博客主要作为个人记录,主要是贴图和代码,不做详细解释,以后有时间可能会重写:从下一篇开始上代码,代码可以运行是对自己的最低标准. 参考: 1.书籍1:<程序员的自我修养--链接.装载与库> 2.视频:https://www.bilibili.com/video/BV1Tt411T7Rs 3.博客1:https://www.cnblogs.com/wanghao-boke/p/11304734.html 进程控制块P…
有时候我们会遇到window进程间共享数据的需求,例如说我想知道系统当前有多少某个进程的实例. 我们能够在程序中定义一个全局变量.初始化为0.每当程序启动后就加1.当然我们我们能够借助第三方介质来储存这个变量,然后解析. 这样做必须做到先写入后解析.不能实时更新数据.假设不考虑其它储存介质.仅仅是进程中的通信,应该怎么做呢?windows提供了一些可行的方法,以下介绍经常使用的两种. 一.共享数据段 #include "stdafx.h" #include <Windows.h&…
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数.系统调用等查询(前期准备) st_ino 执行指令查看stat:man 2 stat 其中用红框标注的引起了我的注意:ino_t st_ino /* inode number */ 而这一个结构体的成员表示,文件的索引信息(进入点),"number"告诉我们它是一个数字表示,而不是一个确切…
fork()是linux的系统调用函数sys_fork()的提供给用户的接口函数,fork()函数会实现对中断int 0x80的调用过程并把调用结果返回给用户程序. fork()的函数定义是在init/main.c中(这一点我感到奇怪,因为大多数系统调用的接口函数都会单独封装成一个.c文件,然后在里面进行嵌入汇编展开执行int 0x80中断从而执行相应的系统调用,如/lib/close.c中: #define __LIBRARY__ #include <unistd.h> _syscall1(…
之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享.接下来我们就来分析分析父子进程是否存在着数据共享. 我们都知道,在linux下,内存存储的位置是全局变量,栈区,堆区,以及文件.字符常量区我们这里不作分析.下面我们依次以实际代码来验证它们是否存在着数据共享.所谓的父子进程数据共享,通俗点说就是父进程或者子进程对于数据的更改,会使得子进程或者父进程的数据同步更改.代码检测的思想是让父子进程中的一个修改…