Linux系统编程
个人学习积累和网上借鉴
攻城lion
这个作者很懒,什么都没留下…
展开
-
7.2、互斥量(互斥锁)的相关API
1、对于多线程的程序,访问冲突与数据紊乱的问题是很常见的,解决的一种办法是引入互斥锁(Mutex);获得锁的线程可以完成“读-修改-写”操作,然后释放锁给其他线程,没有锁的线程只能等待而不能访问共享数据互斥锁的主要函数1、pthread_mutex_init函数初始化一个互斥锁(互斥量) ---> 初值可看作1int pthread_mutex_init(pthread_mutex...原创 2020-02-02 21:25:26 · 421 阅读 · 0 评论 -
7.1、同步的概念与线程同步
1、同步概念 所谓同步,即同时起步,协调一致。不同的对象,对“同步”的理解方式略有不同。例如: 1、设备同步,是指在两个设备之间规定一个共同的时间参考; 2、数据库同步,是指让两个或多个数据库内容保持一致,或者按需要部分保持一致; 3、文件同步,是指让两个或多个文件夹里的文件保持一致。 4、编程中、通信中所说的同步与生活中大家印象中的同步概念略有差异。主旨在协同步调,按预定的先...原创 2020-02-02 21:00:10 · 430 阅读 · 0 评论 -
6.3、线程API使用例子
1、循环创建多个子线程#include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <string.h>void *thrd_func(void *arg){ int i = (int)arg; sleep(i); printf("In thr...原创 2020-02-01 20:54:41 · 161 阅读 · 0 评论 -
6.2、线程控制的相关函数
1、pthread_create函数创建一个新线程。作用,对应进程中fork() 函数。int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);返回值:成功:0;失败:错误号 -----Linux环境下,所有线程特点,失败均直接返...原创 2020-02-01 20:39:05 · 265 阅读 · 0 评论 -
6.1、线程概念及与进程之间的关系
1、什么是线程 LWP:轻量级的进程,本质仍是进程(在Linux环境下)。 线程是进程中的一个实体,是CPU调度和分配的最小单位。 进程:独立地址空间,拥有PCB 线程:也有PCB,但没有独立的地址空间(共享) 区别:在于是否共享地址空间。 独居(进程);合租(线程)。 Linux下: 线程:最小的执行单位 进程:最小分配资源单位,可看成是只有一个线程的进程。2、Li...原创 2020-02-01 20:23:37 · 261 阅读 · 1 评论 -
5、子进程回收(wait和waitpid)
一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除掉这个进程。我们知道一个进程的退出状态可以在Shell中用特殊变量$?查看,因为Shell是它的父进程,当它终止时Shell调用wa...原创 2020-01-28 15:48:07 · 525 阅读 · 0 评论 -
4、回收子进程(僵尸进程和孤儿进程)
1、孤儿进程 孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程。2、僵尸进程 僵尸进程: 进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。3、特别注意 僵尸进程是不能使用kill命令清除掉的。因为kill命令只是用来终止进程的,而僵尸进程已经终止。4、产生孤儿进程的例...原创 2020-01-28 15:01:50 · 217 阅读 · 0 评论 -
3、exec函数组
1、exec函数组的介绍:fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种 exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换, 从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。将当前进程的.text、.data替换为所要加载的程序的.text...原创 2020-01-28 12:32:20 · 172 阅读 · 0 评论 -
2、进程管理
1、进程控制块PCB我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。/usr/src/linux-headers-3.16.0-30/include/linux/sched.h文件中可以查看struct task_struct 结构体定义。其内部成员有很多,我们重点掌握以下部分即可:* 进程id。系统中每个...原创 2020-01-28 12:26:16 · 102 阅读 · 0 评论 -
1、使用Linux的系统接口进行文件的读写
1、所用的主要函数接口open函数#include <sys/types.h>#include <fcntl.h>#include <sys/stat.h>int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);...原创 2020-01-28 12:08:03 · 427 阅读 · 0 评论 -
二、文件描述符
二、文件描述符 对Linux而言,一切皆为文件。所有对设备和文件的操作都是使用文件描述符来进行的。当进程打开一个现存文件或者创建一个现存文件的时候,内核就会向进程返回一个文件描述符但是由于一个进程启动的时候,都会默认打开3个文件:标准输入、标准输出和标准错误输出处理。这3个文件分别对应文件描述符的0、1和2(也就是宏替换后的 STDIN_FILENO、STDOUT_FILENO、STDERR_...原创 2019-09-12 21:21:08 · 167 阅读 · 0 评论 -
一、系统调用和API(用户编程接口)的理解
一、系统调用和API1.1、我们先说一下为什么用户应用程序无法直接获得操作系统内核所提供的一些服务。 在Linux中为了更好的保护内核空间 ,将程序的运行空间分为用户态和内核态。他们分别运行在不同的级别上,二者在逻辑上独立,物理上不独立。所以一般情况下应用程序是不可以直接使用内核函数或者访问内核数据,如果想用,那就必须使用**系统调用。**所以在Linux中系统调用是用户态访问...原创 2019-09-12 21:17:36 · 5284 阅读 · 0 评论