Linux系统编程
月雲之霄
这个作者很懒,什么都没留下…
展开
-
Linux高性能服务器编程
一、文件IO、标准IO1.2.函数dup和dup2三、进程1. fork、vfork、clone2.函数wait、waitpid、孤儿进程、僵尸进程3. 进程组4. 会话四、信号1.函数signal、sigaction2.函信号SIGCHLD3.函数kill、raise、abort、alarm4.信号集、sigprocmask、sigpendin...原创 2019-04-24 15:00:32 · 561 阅读 · 0 评论 -
文件描述符、函数open和openat
文件描述符pcb:结构体 一个进程有一个文件描述符:1024 文件描述符:寻找磁盘文件函数open和openat函数原型:include<sys/stst.h>#include<fcntl.h>int open(const char *pathname, int flags);int open(const char *pathname, in...原创 2018-10-28 10:33:55 · 2684 阅读 · 1 评论 -
线程和fork
#include <unistd.h>#include <pthread.h>#include <stdio.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;void* thread_fun(void* arg){ sleep(1); pid_t pid; pid = ...原创 2019-05-23 20:56:47 · 804 阅读 · 0 评论 -
暂时标记
#include <unistd.h>#include <pthread.h>#include <stdio.h>pthread_key_t key;void *thread_fun1(void *arg){ printf("thread 1 start!\n"); int a = 1; pthread_setspecific(key,...原创 2019-05-23 22:33:25 · 424 阅读 · 0 评论 -
System V 消息队列
S消息队列有一个队列,队列存放各种消息。每个进程可以把数据封存在消息中,再放入队列。每个进程都可以拿到消息队列,再从中取出/放入消息。消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI)二、主要函数运用1. msgget函数原型:用于创建一个新的...原创 2018-11-22 22:35:51 · 278 阅读 · 0 评论 -
存储映射I/O(一)
一、存储映射I/O存储映射I/O使一个磁盘文件与存储空间中的一个缓冲区映射,于是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件,这样,就可在不不适用read和write函数的情况下,使用地址(指针)完成I/O操作。使用这种方法,首先应通知内核,将一个指定文件映射到存储区域中,这个映射工作可以通过mmap函数来实现。二、主要应...原创 2018-10-30 20:11:14 · 779 阅读 · 0 评论 -
存储映射IO(二)
mmap父子进程间通信1. 测试代码:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <sys/mman.h>#include <sys/wait.h>int var = 100;i...原创 2018-10-31 17:28:42 · 207 阅读 · 0 评论 -
共享内存
三、IPC结构:共享内存每个进程内存独立的,无法直接访问。共享内存就是内核管理一段进程(物理内存),这段物理内存允许每个进程进行映射。编程步骤:系统创建、或获取共享内存(拿到物理内存)1. ftok()key 2. shmget()创建/获取共享内存,返回ID。 挂接共享内存(映射)shmat() 使用共享内存 脱接共享内存(解除映射)shmdt() 如果共享内存不再使...原创 2018-11-22 21:43:23 · 409 阅读 · 0 评论 -
fork、vfork、clone
1. 概念写时复制技术最初产生于Unix系统,用于实现一种傻瓜式的进程创建:当发出fork()系统调用时,内核原样复制父进程的整个地址空间并把复制的那一份分配给子进程。这种行为是非常耗时的,因为它需要:为子进程的页表分配页面 为子进程的页分配页面 初始化子进程的页表 把父进程的页复制到子进程相应的页中创建一个地址空间的这种方法涉及许多内存访问,消耗许多CPU周期,并且完全...原创 2019-06-29 20:51:30 · 444 阅读 · 0 评论 -
exec函数族
二、exec函数族1. 简介进程程序替换原理fork创建子进程执行的是和父进程相同的程序(也有可能是某个分支),通常fork出的子进程是为了完成父进程所分配的任务,所以子进程通常会调用一种exec函数(六种中的任何一种)来执行另一个任务。当进程调用exec函数时,当前用户空间的代码和数据会被新程序所替换,该进程就会从新程序的启动历程开始执行。在这个过程中没有创建新进程,所以调用exec并...原创 2019-06-29 20:58:25 · 154 阅读 · 0 评论 -
进程通讯:管道
管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。1、特点:它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。1). 当一个...原创 2018-08-14 14:35:02 · 180 阅读 · 0 评论 -
共享内存
server.c#include<stdio.h>#include<stdlib.h>#include<sys/shm.h> // shared memory#include<sys/sem.h> // semaphore#include<sys/msg.h> // message queue#include<...原创 2019-08-12 15:13:46 · 201 阅读 · 0 评论 -
exec函数族
(1). execl函数原型:int execl(const char *path, const char *arg, ...);分析:path: 要执行的程序的绝对路径 变参arg: 要执行的程序的需要的参数 第一arg:占位 后边的arg: 命令的参数 参数写完之后: NULL 一般执行自己写的程序#include <stdio.h>#includ...原创 2018-10-08 15:22:08 · 601 阅读 · 0 评论 -
会话
一、会话的概念会话:是一个或多个进程组的集合。二、创建会话创建一个会话需要注意以下6点注意事项:调用进程不能是进程组组长,该进程变成新会话首进程(session header) 该进程成为一个新进程组的组长进程。 需要root权限(ubuntu不需要) 新会话丢弃原有的终端控制,该会话没有控制终端 该调用进程是组长进程,则出错返回 建立会话时, 先调用fork,父进...原创 2018-11-06 21:41:11 · 207 阅读 · 0 评论 -
【孤儿进程】孤儿进程组、守护进程
一、孤儿进程组1. 孤儿进程的定义:定义1:该进程组的每个成员的父进程要么是该组的成员,要么在其它会话中。定义2:一个进程不是孤儿进程组的条件是——该组有一个进程,其父进程在属于同一会话的另一个组中。只要能够满足上面其中的任一个定义,则此进程组就是孤儿进程组。可能读起来比较拗口,看图 1 中的例子可能会清楚点。 图 1 中,...原创 2018-11-07 20:32:31 · 570 阅读 · 0 评论 -
前台进程组、后台进程组
一、前台进程组、后台进程组cat | cat &cat | cat | cat输出结果:二、主要函数应用1. tcgetpgrp函数原型:#include <unistd.h>pid_t tcgetpgrp(int fd); 返回值:若成功,返回前台进程组ID, 若出错,返回-1分析:tcgetpgr...原创 2018-11-07 19:07:28 · 1612 阅读 · 0 评论 -
互斥锁、条件变量
一、互斥锁1. 函数原型:pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); pthread_mutex_destroy(pthread_mutex_t *mutex); 分析:pthread_mutex_t 类型,其本质是一个结构体,...原创 2018-10-30 10:21:30 · 751 阅读 · 1 评论 -
【进程】进程组
一、进程组1. 进程组(1)进程组,也称之为作业,BSD与1980年前后向UNIX中增加的一个新特性,代表一个或多个进程的集合。每个进程都属于一个进程组,在waitpid函数和kill函数的参数中都曾经使用到,操作系统设计的进程组的概念,是为了简化对多个进程的管理。当父进程创建子进程的时候,默认子进程与父进程属于同一个进程组,进程组ID等于进程组第一个进程ID(组长进程)。所以,组长...原创 2019-03-27 20:51:34 · 2139 阅读 · 0 评论 -
函数wait、waitpid、孤儿进程、僵尸进程
一、函数wait、waitpid一个进程在终止时会关闭所有文件描述符,释放在用户空间释放的内存,但它的PCB还保留着,内核在其中保存一些信息:如果是正常终止时则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个,这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除这个进程,我们知道一个进程的退出状态可以在shell用特殊变量$?查看,因为shell是它的父...原创 2019-03-27 21:52:49 · 481 阅读 · 0 评论 -
孤儿进程、僵尸进进程
一、儿进程与僵尸进程1、基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。孤儿进程:一个父进程退出,而它的一个或多个子进程还在...转载 2019-04-27 13:47:18 · 106 阅读 · 0 评论 -
【信号】信号集、sigprocmask、sigpending
一、信号集操作函数内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以在用程序自定义set来改变mask,来达到屏蔽指定信号目的。sigset_t set; // typedef unsigned long sigset_tint sigemptyset(sigset...原创 2018-10-16 10:21:17 · 359 阅读 · 0 评论 -
【信号】函数kill、raise、abort、alarm
一、函数kill1. kill函数原型:int kill(pid_t pid, int signo); //signo:信号名分析:pid > 0: 发送信号给指定的进程 pid = 0: 发送信号给调用kill函数进程属于同一个进程组的所有进程 pid < 0:信号signo将发送给进程组= -pid中的每一个进程。 pid = -1:发送给有权限发送...原创 2018-10-15 18:45:46 · 635 阅读 · 0 评论 -
【线程】线程基本函数
一、pthread_self函数功能:获取线程ID。pthread_t pthread_self(void);线程ID:pthread_t类型,本质:在Linux为无符号整数(%lu),其他系统可能是结构体实现 线程ID是进程内部识别标志。(两个进程间,线程ID允许相同)注意:不应使用全局变量pthread_t tid,在子线程通过pthread_create传出参数来获取线程I...原创 2018-10-22 14:49:15 · 1963 阅读 · 0 评论 -
【线程】屏障
一、主要函数应用1. 函数原型:初始化和回收int pthread_barrier_init(pthread *barrier, const pthread_barrier_t *attr, unsigned int count);int pthread_barrier_destroy(pthread_barrier_t *barrier);分析:初始化屏障时,可以使用co...转载 2018-11-21 09:44:13 · 264 阅读 · 0 评论 -
【线程】读写锁
一、概念一把读写锁具备三种状态:读模式下加锁状态(读锁) 写模式下加锁转态(写锁) 不加锁状态2. 读写锁特性:读写锁是写模式加锁时,解锁前,所有对该锁加锁的线程都会阻塞。 读写锁是读模式加锁时,如果线程以读模式加锁会成功,如果线程以写模式加锁会阻塞 读写锁是读模式加锁时,既有试图以写模式加锁的线程,也有试图以读模式加锁的线程,那么读模式会读阻塞随后的读模式锁请求,优先满足...原创 2018-11-16 16:17:55 · 768 阅读 · 0 评论 -
POSIX信号量
一、信号量进化版的互斥锁(1 N)由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住,这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降,线程从并行执行,变成了串行执行,与直接使用单进程无异。二、主要应用函数1 函数原型:初始化信号量sem_init(sem_...原创 2018-10-30 16:09:54 · 1215 阅读 · 0 评论 -
【线程】互斥锁
一、互斥锁1. 函数原型pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); pthread_mutex_destroy(pthread_mutex_t *mutex); 分析:pthread_mutex_t 类型,其本质是一个结构体,为简...原创 2019-03-19 15:12:53 · 908 阅读 · 0 评论