linux系统编程
文章平均质量分 83
云英
滚滚长江东逝水,浪花淘尽英雄。是非成败转头空。青山依旧在,几度夕阳红。
展开
-
linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)
exec族函数函数的作用:我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。exec族函数定义: 可以通过这个网站查询:linux函数查询 功能: 在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是任何Linux下可执原创 2017-06-28 16:24:11 · 49607 阅读 · 7 评论 -
linux IPC---记录上锁
本节讲述的是利用fcntl函数来实现不同进程间的上锁,不管这些进程有没有亲缘关系。前面讲述过有名信号量同样也是可以用在没有亲缘关系的进程间上锁的。而针对线程上锁的一些机制,想要用在不同进程间上锁,就需要把锁放在进程共享内存区操作。记录上锁主要是用到fcntl 函数。fcntl 函数#include<unistd.h> #include<fcntl.h> int fcntl(int fd, i原创 2017-08-19 16:40:27 · 2585 阅读 · 0 评论 -
linux信号量---互斥与同步
信号量信号量也就是操作系统中所用到的 PV 原语,它广泛用于进程或线程间的同步与互斥。信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。在讲信号量之前先说明 PV原语的工作原理。 PV原语通过操作信号量来处理进程间的同步与互斥的问题。 P原语:申请一个空闲资源(把信号量减1),若成功,则退出;若失败,则该进程被阻塞。 V原语:释放一个被占用的资源(把信号量加1),如果发现有被阻原创 2017-08-14 14:24:35 · 3616 阅读 · 0 评论 -
linux同步和互斥综合使用---生产者和消费者
在前面博客linux互斥锁和PV原语, linux信号量—互斥与同步 已经讲了PV原语、互斥锁、信号量,这一节讲他们的综合使用。用一个大家经常用的生产者和消费者的例子来讲解。/* product_consumer.c*/#include <stdio.h>#include <pthread.h>#include <sys/types.h>#include <sys/stat.h>#incl原创 2017-08-14 14:50:42 · 2810 阅读 · 0 评论 -
linux线程同步---条件变量
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待”条件变量的条件成立”而挂起;另一个线程使”条件成立”(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。 linux定义一系列函数来操作条件变量,如下:初始化和反初始化函数:#include <pthread.h>int pthread_cond_init(pthread_cond_t原创 2017-08-14 18:17:56 · 2701 阅读 · 0 评论 -
linux 线程属性控制
本节主要讲 pthread_create 函数的第二个参数——线程的属性。之前设为 NULL,也就是采用默认属性。现在讲一下修改线程属性的方法。 这些属性主要包括绑定属性、分离属性、堆栈地址、堆栈大小、优先级。其中系统默认的属性为非绑定、非分离、缺省1M 的堆栈、与父进程同样级别的优先级。 具体属性的含义请参考手册,本文只讲如何使用这些函数。其实挺简单的, 跟普通的线程调用只需多加三步: 1原创 2017-08-14 21:26:33 · 2632 阅读 · 0 评论 -
linux进程之fork函数
fork函数: fork函数的作用是从调用进程中创建一个新的进程,新的进程相当于是调用进程的副本,称为子进程,而调用进程称为父进程。 本节主要讲解父子进程之间的联系和区别。 函数原型:#include <unistd.h>pid_t fork(void);返回值:在父进程中,fork返回新创建子进程的进程ID。在子进程中,fork返回0。如果出现错误,fork返回一个负值。fork调原创 2017-08-15 14:25:11 · 3132 阅读 · 1 评论 -
linux 无名管道和有名管道fifo
无名管道简介:管道是半双工的,数据只能向一个方向流动,需要双方通信时,需要建立起两个管道。管道只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程):管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,并且只存在于内存中。管道的读写规则:fifo先进先出规则,写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。无名管道相关函数说明:#include <unistd.原创 2017-08-15 20:23:24 · 2971 阅读 · 0 评论 -
linux 标准流管道 popen 源码理解
标准流管道popen、pclose函数说明:#include <stdio.h>FILE *popen(const char *command, const char *type)返回值:若成功,返回文件流指针;若出错,返回-1 参数说明:Command:指向的是一个以 null 结束符结尾的字符串,这个字符串包含一个 shell 命令,并被送到/bin/sh 以-c 参数执行,即由 shel原创 2017-08-15 20:35:16 · 8968 阅读 · 3 评论 -
linux 中signal机制如何应用(一)
前面博客讨论的问题:一个长期运行的Linux程序,想在不退出运行的情况下,通过某种机制,可以让程序知道要不要打印出log。 之前的博客 linux中inotify机制如何应用 用了inotify机制解决了这个问题,现在我们尝试用linux signal机制来实现。大概的思路是注册安装一个信号,用户用kill命令向进程传递信号,进程接收到信号,执行中断处理函数,在函数中把打印log的标志打开。按照惯原创 2017-06-21 15:26:04 · 3442 阅读 · 0 评论 -
linux守护进程
一、守护进程定义守护进程(daemon)是生存期长的一种进程。它们常常在系统引导装入时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。 在linux终端中,我们可以用ps -axj 命令来查看系统的守护进程。选项-a显示由其他用户所拥有的进程的状态,-x显示没有控制终端的进程状态,-j显示与作业有关的信息。在接下来的例子中,通过这个命令可以来查看我们的守护进程是否启动了原创 2017-12-17 11:40:37 · 2982 阅读 · 0 评论 -
wolfssl移植替换openssl
本文的核心是讲怎么把项目中的openssl库替换成wolfssl库,并且尽可能的少改工程代码。一、为什么选择wolfssl替换已有的openssl库wolfssl比较小。 要从工程中移除openssl的最主要的一个原因是openssl太大了。在嵌入式工程中,为了实现一个小的功能,引用了一个openssl,编译生成的固件太大了,flash装不下了。而wolfssl在满足基本需求的同...原创 2018-04-24 18:58:28 · 16375 阅读 · 4 评论 -
linux字节序大小端转化程序
一、前因在项目开发遇到一个问题:读取flash的所有数据到文件,然后用烧录器去烧写到新的flash,烧录后机子起不来。后面发现是从flash读出的数据需要经过字节序转换之后才能用烧录器烧录。于是,自己便写了一个转换的程序。并不是所有从flash读出的数据都需要转换的,是否需要转换取决于开发板数据存放方式和烧录器对数据的处理这两个因素。二、字节序概述字节序是指多字节数据在计算机内存中...原创 2018-07-29 16:06:35 · 5131 阅读 · 0 评论 -
linux互斥锁和PV原语
刚接触linux互斥锁的时候可能会比较抽象,所以本文想要用PV原语来更加具体的理解linux互斥锁。如若有误,烦请指出,不甚感激!由于线程共享了进程的资源和地址空间,因此,任何线程对系统资源的操作都会给其他线程带来影响,如果多个线程同时对进程的共享资源read 或者write,将会发生无法预知的错误。所以,多线程中的同步就是非常重要的事情了。 同步的机制有哪些呢? POSIX 中线程同步的方法,原创 2017-08-11 11:01:08 · 4671 阅读 · 0 评论 -
linux IPC --- 有名信号量详解
在之前的博客中linux信号量—互斥与同步谈到无名信号量。无名信号量主要用于线程间的通信,保存在内存中,如果想要在进程间同步就必须把无名信号量放在进程间的共享内存中。而在进程间的通信中同步用的通常是有名信号量。有名信号量一般保存在/dev/shm/ 目录下。像文件一样存储在文件系统中。 无名信号量的操作主要涉及到以下六个函数:sem_init 用于创建一个信号量,并能初始化它的值。sem原创 2017-08-18 21:16:10 · 8516 阅读 · 1 评论 -
linux IPC---消息队列
消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的,只有内核重启或人工删除时,该消息队列才会被删除。 对于系统中的每个消息队列,内核维护一个定义在 sys/msg.h 头文件中的信息结构。struct msqid_ds {原创 2017-08-17 15:57:05 · 3053 阅读 · 0 评论 -
linux 中signal机制如何应用(二)
上一节linux 中signal机制如何应用(一)讲的例子是不带参数的信号处理机制,这一节讲带参数的。我们知道用kill只是发送信号不能携带参数,如果我们想要发送信号给进程并且携带参数,那就得用sigqueue函数了。可以说,sigqueue函数比kill更加强大,经常是与sigaction()函数配合使用。 sigqueue函数:int sigqueue(pid_t pid,int signo,原创 2017-06-21 16:09:01 · 3039 阅读 · 0 评论 -
linux中inotify机制如何应用
在前面的博客《用可变参数扩展printf》中讨论到如何在应用中控制log的输出。 我们假设的情景是,一个长期运行的Linux程序,想在不退出运行的情况下,通过某种机制,可以让程序知道要不要打印出log 。 我们当时的实现是: 创建一个文件,写进标志位 然后每次要打印log之前先读取这个文件,按照标志位是什么来决定要不要打印log 这样子我们在linux系统上,如果不想打印出这些log,可原创 2017-06-16 17:28:53 · 4053 阅读 · 0 评论 -
用可变参数扩展printf
VA_LIST 是在C语言中解决变参问题的一组宏,所在头文件#include <stdarg.h>,用于获取不确定个数的参数。首先,我们来看看C语言中是如何定义。先看其中比较简单的一种定义,分析完一种,其他实现也可触类旁通。 va_list,定义为字符串指针:typedef char * va_list;VA_START宏,获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是原创 2017-06-16 16:51:40 · 2866 阅读 · 0 评论 -
链式队列的实现与项目中的应用
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。 队列可以用链表实现,也可以用数组实现。本文先讲用链表实现队列。后续有时间再写一篇用数组实现的队列。 链式队列说到底是链表的子集,有一原创 2017-06-04 10:40:10 · 2896 阅读 · 0 评论 -
TCP socket select用法分析
本文主要记录了select一些用法和自己写的一个用select的服务器端例子。首先,我们来看看select函数的定义和参数的含义:int select( int nfds, fd_set FAR* readfds, fd_set * writefds, fd_set * exceptfds, const str原创 2017-06-02 16:22:44 · 16001 阅读 · 0 评论 -
服务器boa分析
Boa是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右。 作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。Boa的设计目标是速度和安全。 在海思和mtk的pon 项目方案中,boa经常用于做web服务器。 在这里对boa的整体架构做一个简单的分析。Boa结构分析:原创 2017-05-31 19:02:15 · 4930 阅读 · 0 评论 -
TCP socket多客户端文件传输
这一节讲一个tcp socket编程中常见的多客户端向服务器传输数据的例子。 程序流程如下:服务器端:socket建立套接字,bind绑定地址,listen开始监听。客户端:socket建立套接字,connect连接服务器,用户输入想要传输的文件名,用send函数把文件发送出去。服务器端:每次监听到客户端的连接,服务器端就调用accept函数,返回新的套接字描述符client_fd,然后创建原创 2017-05-31 17:50:30 · 7936 阅读 · 1 评论 -
TCP socket编程实现
下面是TCP socket的经典流程图 服务器端依次调用socket()、bind()、listen()之后,开始监听指定的socket地址。客户端调用socket(),然后再调用connect()向服务器发送一个连接请求。服务器监听到这个请求之后,就会调用accept()完成接收请求,并且返回一个新的套接字描述符,可用于向客户端读取或发送数据,用的分别是recv()和send()函数。原创 2017-05-24 19:29:31 · 2675 阅读 · 0 评论 -
json-c项目实战
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。 用json做数据交换好处很多,用在web中便于服务端解析。当然在其他地方也经常出现, 比如下面介绍的是在C语言中的json库。json的基本语法网上一大堆,类似于下面这种形式。{ "cmd": "SetPwd", "params": { "i原创 2017-05-24 11:30:05 · 3758 阅读 · 0 评论 -
Linux文件IO-open,write,read,lseek,close
在linux编程中,经常用到open,write,read,lseek,close这几个函数。这里系统总结一下。原创 2017-08-09 15:16:01 · 3520 阅读 · 0 评论 -
linux IPC---共享内存
共享内存共享内存是允许两个或多个进程共享同一块内存区域,因为进程可以直接读写内存,不需要任何数据的拷贝,这是一种最快的进程间通信方式。共享内存是多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。当然,多个进程同时访问共享区就得需要一些同步机制,如信号量或互斥锁等,这些以后再记录,本文先讲最简单的共享内存使用方式。linux共享内存操作的四个原创 2017-08-16 20:55:29 · 2742 阅读 · 0 评论 -
认识linux 线程
线程定义:线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。线程是程序中一个单一的顺序控制流程。进原创 2017-08-09 20:27:35 · 2596 阅读 · 0 评论 -
linux定时中断的三种实现
前言本文主要讲述linux应用层三种定时中断实现的方法。我们可以利用定时中断在linux应用层实现一些对时间频率要求不是很高的驱动,虽然有些不规范,但是也是有其适用的场合的。因为应用层不涉及到硬件,不同平台可移植性更高。 本文涉及到的内容有:多线程间信号的处理三种定时中断的实现测试结果与讨论一、多线程间信号的处理我们先下两个结论,并在后面的测试程序中给出证明。结论一...原创 2018-08-04 22:25:46 · 10431 阅读 · 1 评论