Linux系统笔记
文章平均质量分 92
胖胖的小肥猫
要快乐的热爱生活呀
展开
-
进程初探 linux
[ toc ]1.1 mian函数的调用(1)编译链接时的引导代码,操作系统下的应用程序在 main 函数执行前,其实也需要先执行 一段引导代码,才能去执行 main, 我们写应用程序时,不用考虑引导代码的问题,编译和连接时,(准确说是链接时)由链接器将编译器中 事先准备好的引导代码 链接进去 和 我们的应用程序一起,构成最终的可执行程序。(2)运行时的加载器: 加载器是操作系统中的程序,当我们去执行一个程序时,比如说 ./a.out 并且其代码中,使用 exec 族 函数运行,加载器会将这个程序加原创 2022-03-28 12:40:10 · 176 阅读 · 0 评论 -
守护进程 linux
守护进程守护进程,说白了,就是 能够一直存在,不随着用户等的登入或登出,和整个 操作系统一起运行,在系统启动时开启,在其关闭时终止的进程。守护进程的特性1. 在后台上运行守护进程最重要的特征,便是在后台运行,不随终端的打开关闭与用户的登入登出而关闭打开为避免挂起控制终端,要将 daemon 放入后台执行,其方法是,在进程中调用 fork 使父进程终止,让daemon在子进程中后台执行。具体就是调用 fork ,然后使父进程 exit 。这样做实现了下面几点:第一,如果该精灵进程是由一条简单 sh原创 2022-03-28 12:39:34 · 381 阅读 · 0 评论 -
守护进程概述
守护进程守护进程,说白了,就是 能够一直存在,不随着用户等的登入或登出,和整个 操作系统一起运行,在系统启动时开启,在其关闭时终止的进程。守护进程的特性1. 在后台上运行守护进程最重要的特征,便是在后台运行,不随终端的打开关闭与用户的登入登出而关闭打开为避免挂起控制终端,要将 daemon 放入后台执行,其方法是,在进程中调用 fork 使父进程终止,让daemon在子进程中后台执行。具体就是调用 fork ,然后使父进程 exit 。这样做实现了下面几点:第一,如果该精灵进程是由一条简单 sh原创 2021-08-15 15:44:53 · 599 阅读 · 0 评论 -
Unix 进程回顾
文章目录1.1 mian函数的调用1.2 程序的结束1.3 注册进程终止处理函数 atexitatexit() 注册的进程终止处理函数,会以 栈 的形式存放! 先进后出return 与 exit 与 _exit1.4 进程组,会话组进程组会话组1.5 进程查看命令1.6 杀死进程 kill1.7 什么是守护进程:常见守护进程:1.1 mian函数的调用(1)编译链接时的引导代码,操作系统下的应用程序在 main 函数执行前,其实也需要先执行 一段引导代码,才能去执行 main, 我们写应用程序时,不用原创 2021-08-14 19:05:32 · 136 阅读 · 0 评论 -
Linux共享库、静态库、动态库
Linux共享库、静态库、动态库详解介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。 程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):1、转载 2020-09-16 21:07:27 · 231 阅读 · 0 评论 -
Linux网络编程 1.1 — socket
socket 老规矩膜佬前面我们学习了各种UNIX系统所提供的经典进程间通信机制(IPC):管道、FIFO、消息队列、信号量以及共享存储。这些机制允许在同一台计算机.上运行的进程可以相互通信。而现在我们来学习不同设备(通过网络相连)上的进程相互通信的机制:网络进程间通信(network IPC)。什么是 socketsocket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算.原创 2020-09-08 21:37:12 · 174 阅读 · 0 评论 -
Linux 网络编程概述 — 字节序 暨 进程线程到套接字
回顾之前的进程间通信管道消息队列共享内存信号信号量这些通信方式,全部都是依赖于 linux 内核,同一个linux 系统。而这样,势必导致此类方式无法进行 跨设备 通信。网络编程地址 : { IP地址 作用 : 一台设备拥有一个 IP地址 { 端口号 作用: 一台设备,同时进行的有多项服务,多项多类如 ftp,http,socket,socket,socket ..... 端口号用于分别这些服务数据传输 ———— 协议 :约定了数据格式原创 2020-09-06 20:50:26 · 87 阅读 · 0 评论 -
Linux 线程 1.3 — 条件变量
条件变量相关 API条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为必须锁定互斥量以后才能计算条件。在使用条件变量之前,必须先对它进行初始化。由pthread_cond_t 数据类型表示的条件变量可以用两种方式进行初始化,可以把常量 PTHREAD_COND_INITIALIZER 赋给静态分配原创 2020-09-06 19:28:41 · 87 阅读 · 0 评论 -
Linux 线程 1.2 — 线程同步之互斥量加锁解锁 (4)
互斥量及其相关 API互斥量(mutex)从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为可运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去等待它重新变为可用。在这种方式下,每次只有一个线程可以向前运行。1. 创建和销毁锁锁可以被静态或动态创建,可以用宏 PTHR原创 2020-08-31 16:52:51 · 267 阅读 · 0 评论 -
linux 线程 1.1 — 线程开发 API
Linux上线程开发API概要多线程开发在Linux平台上已经有成熟的 pthread 库支持 (第三方库)。其涉及的多线程开发的最基本概念主要包含三点:线程,互斥锁,条件。其中:线程操作又分线程的创建,退出,等待3种。互斥锁则包括4种操作,分别是创建,销毁,加锁和解锁。条件操作有5种操作:创建,销毁,触发,广播和等待。其他的一些线程扩展概念,如信号灯等,都可以通过上面的三个基本元素的基本操作封装出来。详细请见下表:线程的创建等待及退出线程的创建:#include <pthrea原创 2020-08-31 15:21:04 · 244 阅读 · 0 评论 -
Linux 线程 1.0 — 线程介绍/进程与线程的区别
Linux线程介绍(日常拜佬,这篇文章确实不错)进程与线程典型的 UNIX/Linux 进程可看成只有一个控制线程:一个进程在同一时刻做不止一件事,每个线程各自处理独立的任务。进程 是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。线程 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一原创 2020-08-23 16:26:46 · 79 阅读 · 0 评论 -
Linux 进程间通信 1.5 — 信号量
一、信号量概述:为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操作。二进制信号量是只能取 0 和原创 2020-08-23 15:16:08 · 96 阅读 · 1 评论 -
Linux 进程间通信 1.4.1— 信号的高级发送接收
前言对于初级版的信号的接收与发送,虽然可以完成信号的收发,但是无法携带数据,为了在信号传递的过程中,可以携带数据,就出现了一种高级的收发函数。信号处理函数的注册信号处理函数的注册不只一种方法,分为入门版和高级版入门版:函数signal高级版:函数sigaction信号处理发送函数信号发送函数也不止一个,同样分为入门版和高级版入门版:kill高级版:sigqueue函数注册 sigaction #include <signal.h> int sigact原创 2020-08-22 10:33:35 · 301 阅读 · 0 评论 -
linux 进程间通信 1.4 — 信号
信号(老规矩膜拜大佬)对于 Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。信号,为 Linux 提供了一种处理 异步事件 的方法。比如,终端用户输入了 ctrl+c 来中断程序,会通过信号机制停止一个程序。信号概述信号的名字和编号:每个信号都有一个名字和编号,这些名字都以“SIG”开头,例如“SIGIO ”、“SIGCHLD”等等。信号定义在signal.h头文件中,信号名都定义为正整数。具体的信号名称可以使用 kill -l 来查看信号的名字以及序号,信号是从1开始编号的原创 2020-08-20 10:59:00 · 140 阅读 · 0 评论 -
Linux 进程间通信 1.3 — 共享内存
共享内存共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。因为所有进程共享同一块内存,共享内存在各种进程间通信方式中具有最高的效率。访问共享内存区域和访问进程独有的内存区域一样快,并不需要通过系统调用或者其它需要切入内核的过程来完成。同时它也避免了对数据的各种不必要的复制。因为系统内核没有对访问共享内存进行同步,您必须提供自己的同步措施。例如,在数据被写入之前不允许进原创 2020-08-18 11:10:57 · 243 阅读 · 0 评论 -
Linux 进程间通信1.2 — 消息队列
前面我们所讲的 管道,不论是否匿名,都是半双工的,也就是说,一方只能读,一方只能写。参考大佬博文消息队列消息队列,是消息的链表,存放在 内核中,一个消息队列由一个标识符(即 队列 ID)来表识。特点消息队列是面向记录的,其中的消息具有特定的格式及特定的优先级。消息队列独立与发送与接收进程,进程终止时,消息队列及内容不会被删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按照消息的类型读取。所以:a. B如何加消息?b. A如何从队列拿消息?消息队.原创 2020-08-15 17:14:54 · 199 阅读 · 0 评论 -
Linux 进程间通信 1.1 — 管道 :有名管道 FIFO
有名管道 FIFO在匿名管道 pipe 中,只有通过 fork() 函数,才能使父子进程之间,共享 pipe() 开辟的管道两端的 文件描述符,而其他没有血缘关系(没有共享文件数据,就是指两个文件描述符)的管道则无法通信,因此出现了 FIFO()函数。FIFO()不同于管道之处在于它提供一个路径名与之关联,以 FIFO 的文件形式存储与文件系统中。命名管道是一个设备文件,因此,即使进程与创建的 FIFO的 进程间不存在 血缘关系,访问该路径即可通过 FIFO 实现相互通信。FIFO(first inp原创 2020-08-14 00:44:04 · 180 阅读 · 0 评论 -
Linux 进程间通信1.0 — 管道:匿名管道 pipe
进程间通信对于每一个进程来说这个进程看到属于它的一块内存资源,这块资源是它所独占的,这就导致进程之间的数据交换产生困难,为了解决进程间通信的问题。 因为交换数据必须通过内核,也就是说在内核中开辟一块缓冲区,进程1 把数据 写入 到内核缓冲区,进程 2 则从内核缓冲区中把数据 读走。 内核提供的这种机制称为进程间通信。进程间通信的方式有:匿名管道(pipe)和有名管道(FIFO)信号(signal)消息队列共享内存信号量套接字(socket)匿名管道 pipe—————————————原创 2020-08-10 00:35:00 · 189 阅读 · 0 评论 -
Linux 进程 1.7 — exce族函数配合 fork 使用
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<fcntl.h>#include<sys/wait.h> // 一个奇怪的事情,wait() 函数,在Linux 中,不需要这个 头文件,居然也可以执行int main(){ pid_t pid; int data = 0;原创 2020-07-30 00:23:32 · 105 阅读 · 0 评论 -
Linux 进程 1.6 — exec 族函数
大佬blogexec族函数函数的作用:我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。说白了,就是一个程序去调用另一个程序。功能:在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。 (注意哈,必须是可执行文件)函数族:exec函数族分别是:execl, execlp, execle, e原创 2020-07-29 16:54:38 · 105 阅读 · 0 评论 -
Linux 进程 1.5— 父进程先于子进程结束——孤儿进程
孤儿进程父进程如果不等待子进程退出,在子进程之前就结束了自己的 “生命” ,此时的子进程便称为 孤儿进程。Linux 系统为避免存在过多孤儿进程,设置了 init 进程收留孤儿进程,使其变为 孤儿进程的父进程。init 进程的默认 pid = 1嗐,还是看视频吧,关于UNIX中的讲解 11.50...原创 2020-07-29 00:02:06 · 1560 阅读 · 0 评论 -
Linux 进程 1.4— 父进程等待子进程退出 wait() 函数处理僵尸进程
父进程等待子进程的退出收集子进程的退出状态子进程退出状态不被收集的话,会变成僵尸进程(僵死进程,Z)比如说,之前的代码里vfork() 以后,用 exit() 结束子进程,打开 ps -aux|grep a.out 会发现,子进程仍然存在,不会消失,#include<sys/types.h>#include<sys/wait.h>pid_t wait (int * status);pid_t waitpid (pid_t pid, int * stastus,原创 2020-07-28 22:58:29 · 675 阅读 · 0 评论 -
Linux 进程 1.3— 进程的退出
正常退出:main() 函数调用 return进程调用 exit() ,标准C库进程调用 _exit() 或者 _Exit(),属于系统调用;补充进程最后一个线程返回最后一个线程调用 pthread_exit异常退出7. 调用 abort8. 进程接收到某些信号时,如:ctrl + C9. 最后一个 线程对 取消(cancellation)请求作出 响应#include<stdlib.h>void exit (int status);void _Exit原创 2020-07-27 13:55:12 · 154 阅读 · 1 评论 -
Linux 进程 1.2 — vfork() 函数创建进程
vfork()函数,创建进程与 fork()函数创建进程 的区别:关键区别一:vfork()直接使用父进程的 存储空间,不进行拷贝。关键区别二:vfork()保证子进程先行运行,当子进程调用 exit 退出后,父进程才会执行。说白了嘛,fork()的两个进程,是同时进行的,而 vfork() 只会执行 子程序,并且,当子进程改变了某个变量的值时,父进程中的值,也会随之发送改变;...原创 2020-07-26 23:58:30 · 140 阅读 · 0 评论 -
Linux 进程 1.1 — fork 函数 创建进程,getpid() getppid()
pid_t fork(void);(pid_t 是一个宏定义,其实质是int 被定义在 #include<sys/types.h> 中)复刻(英语:fork,又译作派生、分支)是UNIX或类UNIX中的分叉函数,fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。fork 函数调用成功,返回两次,一次是父进程的 fork ,一次是子进程的 fork返回值为 0原创 2020-07-26 20:28:21 · 795 阅读 · 0 评论 -
Linux 进程1.0 — 什么是进程
1. 什么是进程?什么是程序?程序是静态的概念,使用: gcc xxx.c -o pro在 磁盘中生成的 pro 文件,就叫做程序就是 a.out 。 在 windows中就是 exe狭义上讲,进程就是动态的程序,就是运行起来的程序2. 如何查看系统的进程:在 Windows 中,任务管理器中的,均为进程在 Linux 中,使用 ps 指令查看ps 指令 参数极多,-A 列出所有的行程-w 显示加宽可以显示较多的资讯-au 显示较详细的资讯-aux 显示所有包含其他原创 2020-07-25 11:22:28 · 206 阅读 · 0 评论 -
Linux 文件1.7 — 标准C语言库对文件的操作在<stdio.h>中,fread; fopen; fgets; 等,
int fclose(FILE *fp);文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。fclose() 的用法为:fp 为文件指针;文件正常关闭时,fclose() 的返回值为0,如果返回非零值则表示有错误发生。FILE * fopen (char * filename, char * mode);#include<stdio.h>filename 文件名称mode 打开模式:有: r只读方式打开一个文本文件rb只读方式打开原创 2020-07-23 23:49:29 · 152 阅读 · 0 评论 -
Linux文件 1.6 — 非字符串写入文件;fopen 与 open 打开文件的区别所在
其实我们来看 write()和 read() 函数,会发现 第二个参数 本来是一个 void * buf ,是一个空指针,当我们定义一个int * p ,read(fd,p,sizeof(int));就会传入一个整数给文件,而我们读取的时候,也可以用 read(fd,p,sizeof(int));来读取整数但是,为什么我们之前说Linux的文件皆字符呢? 因为当写入整形数后,vi file;你会发现出现的其实是乱码;那么我们怎么写入一个结构体呢?我们搞一个结构体出来:头文件已原地去世stru原创 2020-07-23 00:42:15 · 131 阅读 · 0 评论 -
Linux 文件1.5— C语言main 函数的参数;编写属于自己的 cp 指令
我们今天来练习一下,Linux 的 cp 指令的实现,实现 cp demo1.c demo2.ccp首先我们得先了解到 C 语言的 main() 函数其实是有两个参数的;C语言规定main函数的参数只能有两个, 习惯上这两个参数写为 argc 和 argv。main函数的函数头可写为: main (argc,argv);C语言还规定 argc (第一个形参)必须是整型变量, argv ( 第二个形参)必须是指向字符串的指针数组。所以加上形参说明后,main函数的函数头应写为:main (arg原创 2020-07-21 16:19:36 · 232 阅读 · 0 评论 -
Linux 文件 1.4—文件描述符0 1 2(文件操作简述)
文件描述符:关于这些:此处这里讲的十分的详细,清晰,膜拜大佬Linux 中有这样一句话,万物皆可文件;1、对于内核而言,所有打开文件都由文件描述符引用,文件描述符是一个非负整数,当打开一个现存文件或者创建一个新文件时,内核向进程返回一个文件描述符,当读写一个文件时,用 open()和 creat()返回文件描述符标识该文件,将其作文参数,传递给 read 和 write 。而在Linux 系统中,有默认文件描述符0 标准输入1 标准输出2 标准错误输出给了三个宏定义:0:原创 2020-07-20 18:19:37 · 3796 阅读 · 1 评论 -
Linux 文件1.3—对前面文件打开创建的补充说明及综述
对前面的一个补充说明及综述:我们前面学了几种函数:文件打开:int open (const char * pathname, int flags);int open (const char * pathname, int flags, mode_t mode);int creat (const char * pathname, mode_t mode);creat 详情见本文末;文件写入:ssize_t write (int fd, const void * buf, size_t cou原创 2020-07-20 01:24:19 · 244 阅读 · 0 评论 -
Linux 文件1.2—文件的光标移动
文件"光标"位置#include<sys/types.h>#include<unistd.h>off_t lseek(int fd, off_t offset, int whence); 作用: 将文件读写指针相对 whence 移动 offset 个字节显然,参数已经不需要赘述了,offset 就是偏移值,重点:当为负数的时候,就是向前移动,当为正数的时候,就是向 whence 后面移动在对 Linux 12.04 的测试,结果:当 whence = SEEK_SET原创 2020-07-19 17:31:03 · 508 阅读 · 0 评论 -
Linux 文件1.1—文件的写入与读取—— read与 write
写入文件:#include<unistd.h>ssize_t write(int fd, const void * buf, size_t count);fd :文件描述符,上节课讲到,当打开一个文件的时候,会返回一个文件描述符,用此描述符来代表此文件;buf :无类型指针,是个缓冲区,count:写入文件的大小,就是将缓冲区 buf 指针所指向的数据,取出 count 个字节,然后写入 fd 中// 首先打开 file1 以确认是一个空文件 输入 vi file1#inc原创 2020-07-19 11:36:54 · 1057 阅读 · 0 评论 -
Linux 文件1.0—文件打开及其创建
针对文件的操作 Linux 系统 提供了很多 函数包含于头文件#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>首先打开文件, 有两个 open 函数, 一个 creat 函数int open (const char * pathname, int flags);int open (const char * pathname, int flags, mode_t mode);int crea原创 2020-07-19 01:01:27 · 163 阅读 · 0 评论