![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux应用编程
文章平均质量分 50
odk
哈哈⊙ω⊙
像我这样平凡的人
展开
-
互斥锁和信号量
一、同步互斥概述在多任务操作系统中,同时运行的多个任务可能都需要访问/使用同一种资源 多个任务之间有依赖关系,某个任务的运行依赖于另一个任务同步和互斥就是用于解决这两个问题的。互斥:一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共资源。POSIX标准中进程和线程同步和互斥的方法,主要有信号量和互斥锁两种方式。同步:两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。 同步就是在互斥的基础上有顺序二、互斥锁2.1 互斥锁的概念mut原创 2021-08-14 19:42:01 · 3181 阅读 · 0 评论 -
线程学习笔记
一、线程概述1.1 线程的概念每个进程都有自己的地址空间,这就造成进程在创建、切换、撤销时,需要较大的系统开销。 为了减少系统开销,从进程中演化出了线程。 线程存在于进程中,共享进程的资源。 线程是进程中的独立控制流,由环境(包括寄存器组和程序计数器)和一系列的执行指令组成。每个进程都有一个地址空间和一个控制线程。1.2 线程和进程的比较线程是CPU调度和分派的基本单位,进程是系统中程序执行和资源分配的基本单位,进程是线程的容器,一般把线程可以看作是轻量级的进程一个进程可以创建多个线程,原创 2021-08-14 14:32:48 · 117 阅读 · 0 评论 -
文件描述符的复制
文件描述符的复制dup 和 dup2 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件。int dup(int oldfd); int dup2(int oldfd, int newfd);dup 和 dup2 经常用来重定向进程的 stdin、stdout 和 stderr。回顾:ls > test.txt包含头文件#include <unistd.h>dup 函数介绍int dup(int oldfd);功能原创 2021-08-12 14:58:22 · 365 阅读 · 0 评论 -
fcntl函数
通过fcntl函数设置文件的阻塞特性设置为阻塞: fcntl(fd, F_SETFL, 0);设置为非阻塞: fcntl(fd, F_SETFL, O_NONBLOCK);如果是阻塞,管道中没有数据,read会一直等待,直到有数据才会继续运行,否则一 直等待如果是非阻塞,read函数运行时,会先看一下管道中是否有数据,如果有数据,则正 常运行读取数据,如果管道中没有数据,则read函数会立即返回,继续下面的代码运行案例:#include <stdio.h>#include <原创 2021-08-12 14:15:48 · 868 阅读 · 0 评论 -
Linux之信号阻塞集
每个进程都有一个阻塞集,它用来描述哪些信号递送到该进程的时候被阻塞(在信号发生时记住它,直到进程 准备好时再将信号通知进程)。所谓阻塞并不是禁止传送信号, 而是暂缓信号的传送。若将被阻塞的信号从信号阻塞集中删除,且对应的信号 在被阻塞时发生了,进程将会收到相应的信号。sigprocmask 函数 创建一个阻塞集合#include <signal.h>int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);功能:检查原创 2021-08-12 13:35:59 · 276 阅读 · 0 评论 -
Linux之信号集
信号集概述 一个用户进程常常需要对多个信号做出处理。为了方便对多个信号进行处理,在Linux 系统中引入了信号集。 信号集是用来表示多个信号的数据类型。信号集数据类型 sigset_t定义路径:/usr/include/i386-linux-gnu/bits/sigset.h (ubuntu 12.04)/usr/include/x86_64-linux-gnu/bits/sigset.h (ubuntu16.04)信号集相关的操作主要有如下几个函数:sigemptysetsigfill原创 2021-08-12 13:27:48 · 537 阅读 · 0 评论 -
可重入函数
可重入函数可重入函数是指函数可以由多个任务并发使用,而不必担心数据错误。意思就是可以被中断的函数,该函数可以在任何时刻中断它,并执行另一块代码, 当执行完毕后,回到原本的代码还可以正常继续运行编写可重入函数:1、不使用(返回)静态的数据、全局变量(除非用信号量互斥)。2、不调用动态内存分配、释放的函数。3、不调用任何不可重入的函数(如标准 I/O 函数)。注 即使信号处理函数使用的都是可重入函数(常见的可重入函数),也要注意进入处理函数时,首先要保存 errno 的值,结束时,再恢复原值。因为原创 2021-08-11 21:43:00 · 1941 阅读 · 0 评论 -
shell学习笔记
一个shell对应一个终端,简单来说shell其实是一种应用程序,是提供了用户操作内核的工具,当我们向终端输入指令时,一回车就会启动一个shell,shell把回车的那个字符串拿来运行,启动某个应用程序,这个应用程序去和内核产生一些结果。...原创 2021-04-14 18:53:23 · 225 阅读 · 0 评论 -
Linux命令记录
vimdiff:同时查看多个文件,可以用qall退出,或者多次wq原创 2021-07-28 11:48:11 · 804 阅读 · 0 评论 -
Linux文件编程
概念:代码如下:运行结果:原创 2021-04-23 11:51:33 · 68 阅读 · 0 评论 -
Ubuntu安装man手册
ubuntu中man的手册默认没有装。用下面几条命令就行了:sudo apt-get install manpagessudo apt-get install manpages-desudo apt-get install manpages-de-devsudo apt-get install manpages-dev原创 2021-04-23 12:38:15 · 198 阅读 · 0 评论 -
父进程等待子进程退出
使用fork函数创建一个进程:pid_t fork(void); 返回值:fork函数调用成功,返回两次返回值为0, 代表当前进程是子进程返回值非负数(该数为子进程的pid号),代表当前进程为父进程返回-1,调用失败代码如下:结果如下:...原创 2021-04-27 15:20:34 · 150 阅读 · 0 评论 -
总结open和fopen的区别
对于这两个名字很类似的函数,对于很多初学者来说,不容易搞清楚它们有什么不同,只知道按照函数用法使用。如果能很好的区分两者,相信大家对于C语言和UNIX系统(包括LINUX)有更深入的了解。在网上查找了一些资料,但是感觉不够全面,一些答案只是从某个角度阐述,所以让人觉得,这个也对,那个也对。但到底谁的表述更正确呢?其实都是对的,只是解释的视角不同罢了。下面结合个人的理解做一些梳理。来源从来源的角度看,两者能很好的区分开,这也是两者最显而易见的区别:open是UNIX系统调用函数(包括LINUX等)原创 2021-04-24 00:10:33 · 108 阅读 · 0 评论 -
用文件编程修改配置文件
思路:1.打开文件2.读文件到readbuf3.修改readbuf,找到要修改的地方4.写readbuf回到文件代码如下:结果如下:原创 2021-04-23 16:15:36 · 135 阅读 · 0 评论 -
Linux用光标移动计算文件大小
代码如下:结果如下:原创 2021-04-23 13:25:51 · 78 阅读 · 0 评论 -
进程间通信->管道
管道,通常指无名管道。1、特点:半双工,具有固定的读端和写端。只能用于具有亲缘关系的进程间通信。是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数,但是它并不属于其他任何文件系统,并且只存在于内存中。2、原型:#include <unistd.h>int pipe(int fd[2]); // 返回值:若成功返回0,失败返回-1当一个管道建立时,它会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开,要关闭管道只需将这两个文件描述符关闭即原创 2021-05-19 00:11:43 · 77 阅读 · 0 评论 -
man手册查不到Linux标准库的解决方法
man的小用法:一般只需直接man+所查命令,但有相同命令时,man出来的结果很可能不是想要的,可以先用man -f 查询,然后用man+数字+命令名查询。程序函数一般可以用man 2+函数名查到,如直接man open出来的并不是open()函数的帮助,发现有俩open,第二个是找开文件,这时就可用man 2 open了$ man -f openopen (1) - start a program on a new virtual terminal (VT).open (2) - open and原创 2021-04-23 11:41:53 · 883 阅读 · 0 评论 -
Linux文件操作原理简述(动态文件和静态文件)
文件操作原理简述:====================================================================标准输入(终端获取)和标准输出(终端输出)的理解代码如下:编译运行程序,终端输入hello,终端输出hello:原创 2021-04-23 15:11:42 · 205 阅读 · 0 评论 -
进程间通信->共享内存
共享内存:两个或多个进程共享一个给定的存储区。1、特点共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。因为多个进程可以同时操作,所以需要进行同步。信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。2、原型1 #include <sys/shm.h>2 // 创建或获取一个共享内存:成功返回共享内存ID,失败返回-1并设置错误码3 int shmget(key_t key, size_t size, int flag);4 // 连接共享内存到当前进原创 2021-05-23 02:19:07 · 107 阅读 · 0 评论 -
进程间通信->有名管道
FIFO,也称为命名管道,它是一种文件类型。1、特点FIFO可以在无关的进程之间交换数据,与无名管道不同。FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。2、原型#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);参数:pathname:文件路径mode:与open的mode相同,mkfifo创建的文件可以用read,write进行传入传出数据返回值:成功返回0,出错返回-原创 2021-05-19 12:10:21 · 94 阅读 · 0 评论 -
popen函数
原型: #include “stdio.h” FILE* popen( const char* command, const char* mode );参数:command:可执行文件 mode:"r” (“r”实现类似system的功能,但它并不打印在屏幕上,而是将结果保存在一个管道中)返回值:成功返回文件流指针,失败返回-1pclose函数:调用popen函数会产生一个子进程了,这个进程必须由pclose关闭。代码实例:popen执行完后,读取内容,结果等同于终原创 2021-05-18 23:50:31 · 503 阅读 · 0 评论 -
进程间通信->消息队列
消息队列,是消息的链表,存放在内核中。每个消息队列都有一个标识符(即队列ID)来标识。1、特点消息队列是面向记录的,其中的消息具有特定的格式(内容)以及特定的优先级(类型)。消息队列由内核管控,与进程无关。进程终止时,消息队列及其内容并不会被删除。消息队列(链表)支持消息的随机查询,也支持按消息的类型读取。2、原型...原创 2021-05-21 01:39:23 · 275 阅读 · 0 评论 -
exec配合fork使用
为什么要用exec族函数,有什么作用?实现功能,当父进程检测到输入为1的时候,创建子进程把配置文件的字段值修改掉。代码如下:#include <stdio.h>#include <sys/types.h>#include <unistd.h>#include <stdlib.h>#include <sys/wait.h>int main(){ int pid; int i; whi原创 2021-05-08 01:05:33 · 189 阅读 · 0 评论 -
linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)
原文链接:https://blog.csdn.net/u014530704/article/details/73848573exec族函数函数的作用:我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。exec族函数定义: 可以通过这个网站查询:linux函数查询功能: 在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是任转载 2021-05-08 00:31:47 · 291 阅读 · 0 评论 -
Linux文件编程:写一个整型数或结构体到文件
代码如下:结果如下:打开fail1文件可以看到:说明在Linux系统往文件写整型数是可以的,并不会影响程序对它的判断,而只是给人的感受是坏掉的,仅此而已。原创 2021-04-23 17:05:22 · 121 阅读 · 0 评论 -
用文件编程实现Linux cp指令
c语言参数的理解(必须要懂):代码如下:结果如下:用文件编程实现Linux cp指令思路:1.打开文件12.读文件1到readbuf3.打开/创建文件24.写readbuf到文件25.关闭文件1、2代码如下:结果如下:...原创 2021-04-23 15:52:39 · 81 阅读 · 0 评论 -
fputc,fgetc,feof的用法
#include <stdio.h>#include <string.h>/*C 库函数 int fputc(int char, FILE *stream) 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。*/int main (){ FILE *fp; char *str="chm henshuai"; int len=strlen(str); fp = fopen("file.txt", "原创 2021-04-24 00:10:21 · 194 阅读 · 0 评论 -
僵尸进程和孤儿进程
僵尸进程:父进程不等待子进程退出,并且子进程先父进程退出,那么子进程变成僵尸进程//运行以下代码:#include <stdio.h>#include <sys/types.h>#include <unistd.h>#include <stdlib.h>#include <sys/wait.h>int main(){ int status; int i = 4; pid_t pid =原创 2021-04-27 21:12:28 · 71 阅读 · 0 评论 -
Linux 信号编程
对于 Linux来说,实际信号是软中断,类似单片机中的硬中断,许多重要的程序都需要处理信号。信号,为 Linux 提供了一种处理异步事件的方法。比如,终端用户输入了 ctrl+c 来中断程序,会通过信号机制停止一个程序。信号概述1.信号的名字和编号:每个信号都有一个名字和编号,这些名字都以“SIG”开头,例如“SIGIO ”、“SIGCHLD”等等。信号定义在signal.h头文件中,信号名都定义为正整数。具体的信号名称可以使用kill -l来查看信号的名字以及序号,信号是从1开始编号的,不存在0原创 2021-05-23 15:56:44 · 279 阅读 · 0 评论 -
进程创建概述
fork创建一个子进程的一般目的:进程创建概述:写时拷贝:写时拷贝顾名思义就是“写的时候才分配内存空间”。这实际上是一种拖延战术。在Linux程序中,fork()会产生一个和父进程完全相同的子进程,传统的fork()系统调用直接把所有的资源复制给新创建的进程,这种实现过于简单并且效率低下,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。======================================原创 2021-04-27 20:40:05 · 164 阅读 · 0 评论 -
system函数
system()函数功能强大,我对linux中的实现比较了解,具体分析这个,windows中的类似就不详解了。好了,先看linux版system函数的源码:代码:#include#include#include#includeint system(const char * cmdstring){ pid_t pid; int status; if(cmdstring == NULL){ return (1); } if((pid = fo原创 2021-05-08 01:23:22 · 1630 阅读 · 0 评论 -
Linux-进程退出
进程退出=正常退出Main函数调用return进程调用exit(),标准c库进程调用_exit()或者_Exit(),属于系统调用异常退出调用abort当进程收到某些信号时,如ctrl+C最后一个线程对取消(cancellation)请求做出响应...原创 2021-04-27 20:38:29 · 94 阅读 · 0 评论