linux
文章平均质量分 86
Better_JH
这个作者很懒,什么都没留下…
展开
-
进程间通信之管道
管道是Linux中很重要的一种通信方式,调用pipe()函数时,会在内核中开辟一块缓冲区即管道。该缓冲区的大小固定,为1页即4kb。管道分为匿名管道和命名管道。匿名管道:#include#include#include#includeint main(){ int pipefd[2] = {0,0}; if((pipe(pipefd))0) { pe原创 2017-03-03 16:52:21 · 316 阅读 · 0 评论 -
死锁的相关概念
死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 典型的死锁情形**:**1.如果同一个线程先后两次调用lock,在第二次调用时,由于锁已经被占用,该线程会挂起等待别的线程释放锁,然而锁正是被自己占⽤着原创 2017-04-04 22:19:56 · 542 阅读 · 0 评论 -
多线程的互斥机制
虽然多个线程共享同一地址空间,使得多个线程之间可以很方便的进行通信,但是当多个线程访问同一临界资源时,很可能出现访问冲突的问题。所以此时就要引入同步与互斥机制。 来看下面的代码:#include<stdio.h>#include<pthread.h>int g_val = 0;void* thread(void* _val){ int val = 0; int count原创 2017-03-24 17:36:00 · 1403 阅读 · 0 评论 -
守护进程
守护进程又称精灵进程(daemon):是运行在后台的一种特殊进程;它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。 守护进程的特点: 1、自成一个会话; 2、没有控制终端,不能直接和用户交互; 3、一直在运行着,不受用户登录和注销的影响。 Linux系统启动时会启动很多系统服务进程;用ps axj命令查看系统中的进程,在COMMAND一列用[]括起来的名字表示内核线程,这原创 2017-05-13 13:41:22 · 333 阅读 · 0 评论 -
umask()函数
mode_t umask(mode_t mask)//为进程设置文件模式创建屏蔽字,并返回以前的值umask常与open函数一起使用 int open(const char *pathname, int flags, mode_t mode); int creat(const char *pathname, mode_t mode);在创建一个文件时要指明该文件的权限,open()函数的最后一个原创 2017-05-13 14:17:02 · 476 阅读 · 0 评论 -
POSIX下的信号量(生产者&消费者模型)
System V下的信号量主要用于进程间通信,也可以用于线程(不推荐) POSIX下的信号量主要用于线程间通信,也可以用于进程(不推荐) 本篇主要研究POSIX下的信号量 信号量变量的类型为sem_t。主要接口: 信号量的创建: int sem_init(sem_t *sem, int pshared, unsigned int value); 参数1:sem信号量地址 参数2:ps原创 2017-04-26 14:59:46 · 428 阅读 · 0 评论 -
读写锁(读写者问题)
先来了解一下什么是自旋锁? 自旋锁是一种保护共享资源的锁机制。与互斥锁类似,无论是互斥锁还是自旋锁,在任何时刻都只有一个持有者。但是两者在调度机制上略有不同。对于互斥锁,如果锁资源已经被占用,则锁资源的申请者只能挂起等待。但是对于自旋锁而言,如果锁资源已经被占用,则锁资源的申请者就一直循环在那里看该自旋锁是否被该锁的保持者释放。 读写锁:读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成原创 2017-04-26 15:31:23 · 977 阅读 · 0 评论 -
信号
一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件(是相对于进程来说的)。Linux系统中共有62个信号,1—31(普通信号),34—64(实时信号)。信号的产生1、终端组合键 Ctrl-C产生SIGINT信号(终止进程),Ctrl-\产生SIGQUIT信号(终止进程并且Core Dump),Ctrl-Z产生SIGTSTP信号(来自终端的停止信号)。 Core Dump(核心转储)原创 2019-11-05 17:16:16 · 361 阅读 · 0 评论 -
线程安全和可重入函数
线程安全:被多个并发线程反复调用时,依然产生正确的结果。 重入:一个函数被多个线程同时访问。 可重入函数:一个被多个线程调用的函数没有引用任何共享数据(全局变量以及静态变量)。 如果一个函数被重入后,导致程序出现错误,则称该函数为不可重入函数。任何线程不安全问题的根源都是“共享数据”。所以不使用任何共享数据的函数(可重入函数)肯定是线程安全的。但这并不等于线程安全函数就是可重入函数。因为:即使原创 2017-04-27 17:50:07 · 399 阅读 · 0 评论 -
多线程的同步与互斥机制(生产者&消费者模型)
同步:所有线程以某种顺序依次访问临界资源。 同步机制的实现:条件变量—–是利用线程间共享的全局变量进行同步的机制。(一个线程等待“条件变量的条件成立”而挂起;另一个线程使“条件成立”(给出条件成立信号)。为了防止竞争资源,条件变量总是和互斥锁结合使用) 为什么要实现同步机制呢?(为了防止竞争资源) 以生产者消费者模型为例,首先我们需要了解什么是生产者消费者模型:(三种关系、两种角色、一个交易场原创 2017-04-26 14:40:28 · 1151 阅读 · 0 评论 -
进程间通信之消息队列
消息队列由操作系统提供,一个进程向另一个进程发送有类型数据块。(随内核)消息队列的实现:comm.h:#ifndef _COMM_H_#define _COMM_H_#include#include#include#include#include#define PATHNAME "."#define PROJ_ID 0x6666#define SERVER_TYPE 1#define原创 2017-03-03 18:54:18 · 261 阅读 · 0 评论 -
进程间通信之信号量
信号量:相当于一个计数器,描述当前环境下临界资源的数目。信号量是用来保护临界资源的,而信号量本身也是临界资源。原子性:即要么做,要么不做。临界资源:不同进程可以看到的同一资源。临界区:不同进程访问同一资源的代码区(write(),read())。互斥:任一时刻,只有一个进程进入临界区访问临界资源,且访问时具有原子性。同步:所有进程以某种顺序依次访问临界资源。信号量的两个原创 2017-03-14 20:58:16 · 609 阅读 · 0 评论 -
进程间通信之共享内存
共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。但没有同步与互斥机制,所以往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。生命周期:随内核。共享内存实现机制:在物理内存上申请一块空间,再在页表上添加映射信息,把信息映射到地址空间上,将申请的内存地址的虚拟地址给tast_struct。如图所示:图示原创 2017-03-22 22:20:57 · 440 阅读 · 0 评论 -
linux下进度条的实现及其理论思想
在编写进度条之前我们需要先了解printf函数缓冲区问题以及 \n与\r的区别。首先:\n与\r: \n:换行符+回车 \r:回车符其次:printf缓冲区: 输出到屏幕相当于访问外设,而外设的速度和内存的速度是相差甚远的,如果每次输出都直接去访问外设,一定会造成效率的下降。所以,printf设置了三种缓冲方式。原创 2017-02-16 19:42:03 · 585 阅读 · 0 评论 -
task_struct结构
task_struct结构 在linux中每个进程都由task_struct数据结构来定义。task_struct就是我们通常所说的PCB。它是对进程控制的唯一手段也是最有效的手段。struct task_struct {volatile long state; // 说明该进程是否可以执行,是否可以中断等信息unsigned long flags; // flags是原创 2017-02-18 19:17:24 · 516 阅读 · 0 评论 -
进程的调度算法
一.先来先服务(First Come First Service,FCFS)原创 2017-02-18 20:08:47 · 556 阅读 · 0 评论 -
atexit函数、t 权限位以及FILE结构
一.atexit()函数当使用atexit函数连续注册三个函数时,当进程退出时这三个函数的调用顺序如何先看一下下面的代码运行结果如下图:根据结果可知,先运行的是fun3,其次是fun2,最后是fun1.二.t 权限位粘滞位,位于o(other)的 x 位,原位置有执行权限,就置为 t ,否则置为 T . 我们知道/tmp是系统的临原创 2017-02-19 18:47:39 · 256 阅读 · 0 评论 -
linux下特殊权限位的使用
Linux系统中除了我们现在所熟知的读(r)、写(w)、执行(x)权限外,还有三个比较特殊的权限,分别为:suid、sgid和sticky(粘滞位)1.setuid和setgid以修改密码为例 分析一下,/etc/passwd的权限为 -rw-r--r-- 也就是说:该文件的所有者拥有读写的权限,而用户组成员和其它成员只有查看的权限。我们知道,在系统中我们要修改一原创 2017-02-20 09:33:10 · 423 阅读 · 0 评论 -
Linux下实现简易的shell
相关代码如下:#include#include#include#include#includeint main(){ char cmd[128]; while(1) { printf("[LJH@My_host MyShell]$ "); fflush(stdout); ssize_t _s = read(0,cmd,sizeof(c原创 2017-03-03 15:54:24 · 397 阅读 · 0 评论 -
线程的创建、等待及终止
首先来了解一下线程与进程的区别: 1.线程是在进程的地址空间中执行的控制流; 2.一个进程的多个线程共享同一地址空间; 3.进程是分配系统资源的基本单位; 4.线程是调度的基本单位; 5.在linux下,没有所谓的线程,线程都是用进程模拟出来的,线程又被称为轻量级进程。 注:进程拥有一个完整的虚拟地址空间,不依赖于线程而独立存在;反之,线程是进程的一部分,没有自己的地址空间,与进程内的其原创 2017-03-23 17:17:32 · 347 阅读 · 0 评论 -
线程的分离属性
在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached)。 可结合属性:创建线程时,线程的默认属性是可结合的, 如果一个可结合线程结束运行但没有被join,则它的状态类似于进程中的Zombie(僵死),即它的存储器资源(例如栈)是不释放的,所以创建线程者应该调用pthread_join来等待线程运⾏结束,并得到线程的退出码,回收其资源。 可分离属性:通过原创 2017-03-23 18:58:38 · 3435 阅读 · 0 评论 -
linux下的错误码
#include<stdio.h>int main(){ int i = 0; while(i<150) { printf("%d %s\n",i,strerror(i)); i++; } return 0;} ….. ….. ….. 由运行结果可知,一共有133个错误码。原创 2017-03-23 19:29:18 · 351 阅读 · 0 评论 -
stat、find指令的相关用法
1.执行stat 文件名,出现的时间信息的含义。 Access time:文件的访问时间,即对文件的内容进行最后一次访问的时间。 Modify time:文件的修改时间,即对文件的内容进行最后一次修改的时间。 Change time:文件的状态改变时间,即对文件的属性进行最后一次修改的时间。通过命令:more file来修改文件的Access time,如图:原创 2017-02-15 12:28:57 · 448 阅读 · 0 评论