自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

luciusvorenus

转行之路长漫漫

  • 博客(121)
  • 收藏
  • 关注

原创 信号的概念与机制

信号的共性:1. 简单(开销小,且在用或者不用的情况下,开销是一样的);2. 不能携带大量信息(如程序执行过程中,出现段错误时, 就会发送一个相关的信号(编号为11)终止该进程的运行);3. 满足某个特定条件才发送。信号是信息的载体,Linux/UNIX 环境下,古老、经典的通信方式,现在依然是主要的通信手段。Unix早期版本就提供了信号机制,但不可靠,信号可能丢失。Berkeley 和 ...

2019-03-31 23:39:03 235

原创 mmap无血缘关系进程间通信

实质上mmap是内核借助文件帮我们创建了一个映射区,多个进程之间利用该映射区完成数据传递。由于内核空间多进程共享,因此无血缘关系的进程间也可以使用mmap来完成通信。只要设置相应的标志位参数flags即可。若想实现共享,当然应该使用MAP_SHARED了。// mmap_w.c #include <stdio.h>#include <sys/stat.h&...

2019-03-31 17:01:39 1052

原创 匿名映射

通过使用我们发现,使用映射区来完成文件读写操作十分方便,父子进程间通信也较容易。但缺陷是,每次创建映射区一定要依赖一个文件才能实现。通常为了建立映射区要open一个temp文件,创建好了再unlink、close掉,比较麻烦。 可以直接使用匿名映射来代替。其实Linux系统给我们提供了创建匿名映射区的方法,无需依赖一个文件即可创建映射区。同样需要借助标志位参数flags来指定:MAP_ANONYM...

2019-03-31 17:01:23 1900

原创 mmap父子进程间通信

父子等有血缘关系的进程之间也可以通过mmap建立的映射区来完成数据通信。但相应的要在创建映射区的时候指定对应的标志位参数flags:MAP_PRIVATE:(私有映射)父子进程各自独占映射区;MAP_SHARED:(共享映射)父子进程共享映射区。//父进程创建映射区,然后fork子进程,子进程修改映射区内容,而后,父进程读取映射区内容,查验是否共享。 #include <st...

2019-03-31 17:01:06 787

原创 mmap和munmap对文件进行操作(读写等)

//mmap、munmap函数的使用#include <stdio.h>#include <string.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <stdlib.h>#include <sys/mman.h...

2019-03-30 21:05:05 648

原创 mmap、munmap函数

#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);int munmap(void *addr, size_t length);void *mmap(void *addr, size_t length, int prot...

2019-03-30 21:04:16 1375

原创 mmap内存映射、system V共享内存和Posix共享内存

linux内核支持多种共享内存方式,如mmap内存映射,Posix共享内存,以system V共享内存。当内核空间和用户空间存在大量数据交互时,共享内存映射就成了这种情况下的不二选择。它能够最大限度的降低内核空间和用户空间之间的数据拷贝,从而大大提高系统的性能。共享内存是最有用,也是最快的IPC方式。两个不同进程A、B共享内存时,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即...

2019-03-30 21:03:36 2599 3

原创 文件进程间通信

使用文件也可以完成IPC,理论依据是,fork后,父子进程共享文件描述符。也就共享打开的文件。//父子进程共享打开的文件。借助文件进行进程间通信(可先打开文件,再创建子进程)#include <unistd.h>#include <string.h>#include <stdlib.h>#include <fcntl.h>#incl...

2019-03-30 21:01:16 692

原创 FIFO(命名管道)

FIFO常被称为命名管道,以区分管道(pipe)。管道(pipe)只能用于“有血缘关系”的进程间。但通过FIFO,不相关的进程也能交换数据。FIFO是Linux基础文件类型中的一种(p,管道文件)。但FIFO文件在磁盘上没有数据块,仅仅用来标识内核中一条通道。各进程可以打开这个文件进行read/write,实际上是在读写内核通道,这样就实现了进程间通信。另外,使用统一fifo文件,可以有多个读端和...

2019-03-30 20:58:51 2061

原创 管道缓冲区大小

可以使用ulimit –a 命令来查看当前系统中创建管道文件所对应的内核缓冲区大小。通常为:pipe size 4K,即一个页面大小。也可以使用fpathconf函数来查看:#include <unistd.h>long fpathconf(int fd, int name);当需要查看管道的大小时,参数name需要指定为:_PC_PIPE_BUF成功:返回管道的大小...

2019-03-30 20:56:39 3038

原创 管道的读写行为

使用管道需要注意以下4种特殊情况(默认都是阻塞I/O操作,没有设置O_NONBLOCK标志):1. 如果所有指向管道写端的文件描述符都关闭了(管道写端引用计数为0),而仍然有进程从管道的读端读数据,那么管道中剩余的数据都被读取后,再次read会返回0,就像读到文件末尾一样。2. 如果有指向管道写端的文件描述符没关闭(管道写端引用计数大于0),而持有管道写端的进程也没有向管道中写数据,这时有...

2019-03-30 20:56:01 3701

原创 pipe函数

#include <unistd.h>int pipe(int pipefd[2]);作用:创建管道 成功:0;失败:-1,设置errno函数调用成功返回r/w两个文件描述符。无需open,但需手动close。规定:fd[0] → r; fd[1] → w。向管道文件读写数据其实是在读写内核缓冲区。且调用成功后的默认打开方式就是非阻塞打开方式...

2019-03-30 20:52:57 2955 1

原创 管道的概念(匿名管道)

管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。管道有如下特质:1.其本质是一个伪文件(实为内核缓冲区),伪文件即不是真正的文件,不占用磁盘空间,其文件描述符为p。另外,s(套接字文件)、b、c均为伪文件;2.由两个文件描述符引用,一个表示读端,一个表示写端。管道的两端各是一个进程,总共两个进程(也可以是一个进程,但是没有意义);3.规...

2019-03-30 20:51:26 1422

原创 进程间通信的方法

Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。在进程间完成数据传递需要借助...

2019-03-30 20:50:47 538

原创 waitpid函数

#include <sys/wait.h>#include <sys/types.h>pid_t waitpid(pid_t pid, int *status, int options);作用:同wait,但可指定pid进程清理,可以不阻塞。waitpid函数的第二个参数int *status跟wait函数的形参一样,且都是利用相同的宏函数来进一步获取...

2019-03-27 00:58:46 3594

原创 wait函数

#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *status);僵尸进程。进程结束后放弃了几乎所有的内存空间,没有任何可以执行的代码,也不能被调度,仅仅在进程列表中保留着一个位置,记载着该进程的退出状态等信息供其他进程收集,除此之外僵尸进程不再占有任何内存空间。当进程终止时,操...

2019-03-27 00:56:05 2921

原创 孤儿进程与僵尸进程

孤儿进程:父进程先于子进程结束(遇到return、exit、异常终止等情况时),则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程。可以通过getppid函数来查看孤儿进程的父进程ID,即init进程的ID,init进程的ID具体是多少取决于操作系统对进程的调度,其值是不确定的。在操作系统中,init进程也不止一个,可通过ps aux详细查看。僵尸进程:进程终止...

2019-03-27 00:54:28 201

原创 exit与_exit函&fork与vfork函数

#include <stdlib.h>void exit(int status);#include <unistd.h>void _exit(int status);exit函数与_exit函数一样,都是系统函数,且都是用来终止一个进程的,无论在程序中的什么位置,只要执行这exit或_exit系统调用,进程就会被终止。这两个函数都有一个整型形参,用于传...

2019-03-26 01:17:40 607

原创 EXEC函数族的一般规律

事实上,只有execve是真正的系统调用,其它五个函数最终都调用execve,所以execve在man手册第2节,其它函数在man手册第3节。这些函数之间的关系如下图所示。...

2019-03-26 01:17:08 140

原创 EXEC函数族

fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支,通过if语句对i进行判断),子进程往往要调用一种exec函数以执行另一个程序(不再回来了,即剩下没有执行完的程序等数据都被清除了)。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程(其实启动例程才是真正的程序入口地址,启动例程是调用main函数的哪个函数,先于main函数执行,启...

2019-03-26 01:15:52 385

原创 gdb调试(如何跟踪指定进程)

使用gdb调试的时候,gdb只能跟踪一个进程。可以在fork函数调用之前,通过指令设置gdb调试工具跟踪父进程或者是跟踪子进程。默认跟踪父进程。set follow-fork-mode child 命令设置gdb在fork之后跟踪子进程。set follow-fork-mode parent 设置跟踪父进程。注意,一定要在fork函数调用之前设置才有效。(可以通过在fork函数处设置断...

2019-03-25 17:16:31 6097

原创 进程共享(读时共享写时复制)

父子进程之间在刚fork后。父子相同处: 全局变量、.data、.bbs、.text、栈、堆、环境变量、用户ID、宿主目录(进程用户家目录)、进程工作目录、信号处理方式等等,即0~3G的用户空间是完全一样的。父子不同处: 1.进程ID 2.fork返回值 3.父进程ID 4.进程运行时间 5.闹钟(定时器) 6.未决信号集似乎,子进程复制了父进程0-3G用户空间内容,以...

2019-03-25 17:15:51 4202 2

原创 getuid、geteuid、getgid和getegid函数

#include <unistd.h>#include <sys/types.h>uid_t getuid(void);uid_t geteuid(void);作用:getuid返回当前进程的实际用户ID;geteuid返回当前用户的有效用户ID。这两个总是成功,不会失败。#include <unistd.h>#include &l...

2019-03-25 17:15:19 6594

原创 循环创建N个子进程

以循环创建5个进程为例,给出如下代码,分析其错误:#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(void){ int i; pid_t pid; printf("xxxxxxxxxxx\n"); for (i = 0; i &lt...

2019-03-25 17:14:42 2035

原创 fork、getpid、getppid函数

#include <unistd.h>pid_t fork(void);作用:创建一个子进程。到目前为止,我们可以直到两种创建进程的方法:1. 通过执行二进制文件来创建一个进程,如:./a.out /bin/ls;2.通过fork函数来创建一个子进程。该函数没有形参,返回值类型为pid_t,为无符号整型。而进程的id为正整数。如果失败,则返回-1;如果成功,则由于父进...

2019-03-25 17:12:40 3099

原创 环境变量

(1)环境变量的定义环境变量,是指在操作系统中用来指定操作系统运行环境的一些参数(每个用户以及每个进程的环境变量都不一定相同,各自有各自的设置)。通常具备以下特征:字符串(本质);有统一的格式:名=值:值;值用来描述进程环境信息(如目录、文件路径等)。存储形式:与命令行参数类似(argc和argv)。char *[ ]数组,数组名environ,内部存储字符串,NULL作为哨兵结尾。例如,...

2019-03-24 19:38:13 2294

原创 进程控制块PCB(进程描述符)

(1)PCB每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。grep -r “task_struct” / 可以查找根目录下,包含task_struct的文件文件。或者 find /usr -name sched.h。从而,在/usr/include/linux/sched.h文件中可以查看struct task_s...

2019-03-24 19:35:48 3782

原创 CPU和MMU(内存管理单元)

CPU的架构:要求能够理解从源程序到微指令的整个经历过程:存储器的层次结构(网络资源下载到硬盘、磁盘缓存、内存、Cache、寄存器);CPU的四大部分:ALU、CU、中断系统和寄存器;程序执行的整个过程(高级语言机器、汇编语言机器、操作系统机器、机器语言机器和微指令系统)。进程控制块PCB位于内核空间。MMU(内存管理单元):包括从逻辑地址到虚拟地址(线性地址)再到内存地址的变换过...

2019-03-22 02:16:27 4116

原创 进程相关概念

(1)程序和进程程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu、内存、打开的文件、占用的设备、使用的锁等),磁盘一般不属于系统资源。进程,是一个抽象的概念,与操作系统原理联系紧密。进程是活跃的程序,占用系统资源。在内存中执行。(程序运行起来,产生一个进程)。同一个程序也可以加载为不同的进程(彼此之间互不影响)。如:同时开两个终端。各自都有一个bash但彼此ID不同。(2...

2019-03-22 02:13:01 132

原创 fcntl函数(网络编程会用)

#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd);int fcntl(int fd, int cmd, long arg);//long 长整型int fcntl(int fd, int cmd, struct flock *lock);可见fcntl函数是一个可变参数函数(函...

2019-03-21 22:51:48 775

原创 dup和dup2函数

#include <unistd.h>int dup(int oldfd);int dup2(int oldfd, int newfd);作用:dup函数实现对一个文件的文件描述符进行复制,复制之后该进程就会新增加一一个文件描述符指向该文件(即实现同一个文件对应多个文件描述符)。dup2函数:如果new是一个被打开的文件描述符(与old不是同一个文件),则在拷贝前先关闭ne...

2019-03-21 22:50:51 434

原创 opendir、readdir和closedir函数

注意:在Linux中,目录的输入格式:/mnt//fghs、/mnt/fghs、/mnt/fghs和/mnt/fghs//是等效的,都一样。#include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name);DIR *fdopendir(int fd);返回值:出错返回NULL,...

2019-03-21 17:32:47 1963

原创 chdir、getcwd、mkdir、rmdir函数

#include <unistd.h>int chdir(const char *path);int fchdir(int fd);作用:改变调用这一函数的进程(即程序执行)的当前工作目录,注意不是shell的当前工作目录。返回值:0成功 -1失败#include <unistd.h>char *getcwd(char *buff, size...

2019-03-21 17:31:03 635

原创 目录操作相关的系统函数

主要介绍几个常用函数的使用方法:chdir(改变进程的当前工作目录)、getcwd(获取当前进程的工作目录)、mkdir(创建目录)、rmdir(删除空目录)、opendir(打开一个目录)、readdir(读目录)、closedir(关闭目录)。后三个函数常常用到!另外,介绍几个常用的字符串函数:strcmp和sprintf函数。#include <string.h>in...

2019-03-21 12:43:17 200

原创 link、symlink、readlink、unlink函数的使用

#include <unistd.h>int link(const char *oldpath, const char *newpath);作用:创建一个硬链接 0成功 -1 失败//代码#include <stdio.h>#include <stdlib.h>#include <unistd.h>int ma...

2019-03-21 00:15:13 1468

原创 truncate、rename函数的使用

#include <unistd.h>#include <sys/types.h>int truncate(const char *path, off_t length);int ftruncate(int fd, off_t length);作用:用于拓展或截断文件。将参数path 指定的文件大小改为参数length 指定的大小。如果原来的文件大小比参数l...

2019-03-21 00:13:50 366

原创 chmod、chown函数的使用

#include <sys/stat.h>int chmod(const char *path, mode_t mode);int fchmod(int fd, mode_t mode);作用:改变指定文件的权限。第二个参数:mode必须为一个8进制数;返回值为0表示成功,-1表示失败。//代码#include <stdio.h>#include &...

2019-03-21 00:12:30 906

原创 access、strtol函数的使用(后者为C库函数)

#include <unistd.h>int access(const char *pathname, int mode);作用:检查调用该函数的进程是否可以对指定的文件执行某种操作。第一个形参:文件名;第二个形参:R_OK(是否可读)、W_OK(是否可写)、X_OK(是否可执行)、F_OK(文件是否存在);返回值:0表示拥有所查的权限(即符合该权限)、-1(未通过所查询的...

2019-03-21 00:10:37 223

原创 stat函数(stat、fstat、lstat)

#include <sys/types.h>#include <sys/stat.h>#include <unistd.h> //需包含头文件有如下三个函数的函数原型:int stat(const char *path, struct stat *buf);第一个形参:指出文件(文件路径); 第二个形参:出参数(函数对该参数操作,然后...

2019-03-20 18:26:33 5447 2

原创 文件操作相关的系统函数

重点学习:stat(fstat、lstat 获取文件属性)、access(测试指定文件是否拥有某种权限)、chmod(改变文件的权限)、chown(改变文件的所属主和所属组)、truncate(截断或拓展文件)、link(创建硬链接)、symlink(创建软链接)、readlink(读软链接对应的文件名,即软链接本身的内容,文件路径)、unlink(删除符号链接、硬链接数减1、临时文件关闭时自删除...

2019-03-20 18:21:59 176

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除