Linux系统编程
关于Linux常见问题
AlexanderGan
对计算机和机器人的世界充满好奇。
展开
-
线程池_详解C语言实现的线程池
一、线程池功能定义: 频繁的创建和启动线程会带来很大的开销,所以为了提高多线程任务处理效率,才有了线程池。其实池化技术都有一个特点,无论是内存池、线程池还是对象池等池化技术主要都是为了提高资源分配效率,预先分配一些资源在池子中,根据需要动态的调整和分配池中的资源(要弄清楚线程池,需要耐心阅读下面的代码哦,代码来自传智播客的教学资料)。 上图是对线程池基本工作原理的描述,但是实际实现还需要管理者线程来对工作线程进行调配,管理者线程不参与工作。线程池需要具备以下基本功能:1.需要维护一个任务队列,通原创 2020-12-15 16:59:25 · 2303 阅读 · 0 评论 -
linux_主线程子线程退出关系
我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下。1、 主线程等待新线程先结束退出,主线程后退出。正常执行。实例代码:#include "apue.h" #include <pthread.h> pthread_t ntid;//线程ID void printids(const char *s) { pid_t pid; pthread_t tid; pid转载 2020-07-16 10:20:01 · 1111 阅读 · 0 评论 -
apue学习之使用条件变量实现生产者消费者模型
apue学习之使用条件变量实现生产者消费者模型一、条件变量 条件变量提供了一种线程同步的机制,当条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。条件本身是由互斥量保护的,所以线程在改变条件状态之前必须先锁住互斥量。虽然互斥锁实现了线程之间的互斥,但是互斥锁也有不足之处,它只能表示两种状态:上锁和非上锁。但是假如有线程A拿着锁进入临界区,并在临界区休眠了。而此时正在等待该锁的线程就会不断轮询,查看锁是否已经被释放。当线程A释放锁后,所有在该锁上阻塞的线程都会变成可运行状态,第一个变原创 2020-07-11 21:18:32 · 218 阅读 · 0 评论 -
apue学习之读写锁实现线程同步
apue学习之读写锁实现线程同步// File Name: pthread_rwlock.c// Author: AlexanderGan// Created Time: Thu 02 Jul 2020 10:20:15 AM CST#include<stdio.h>#include<string.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#incl原创 2020-07-06 11:44:02 · 142 阅读 · 0 评论 -
apue学习之互斥量实现线程同步
apue学习之线程同步一、互斥量 互斥量本质上是一把锁,线程在访问共享资源进行加锁,访问完成后进行解锁,对互斥量加锁之后,任何其他试图再对互斥量加锁的线程会被阻塞直到当前线程释放该互斥锁。如果释放互斥量时有多个线程阻塞,那么这时所有该锁上的阻塞线程都会都会变成可运行状态,第一个变成运行态的线程又对互斥量加锁。 使用互斥量时,所有的线程都要遵循相同的访问规则,互斥机制才能有效。如果某个线程在没有获得互斥量的情况下也能访问共享资源,那么这种机制就会出问题。二、避免死锁 产生死锁的方式有两种,第一原创 2020-07-06 11:07:05 · 223 阅读 · 0 评论 -
apue学习之多线程拷贝文件
apue学习之多线程拷贝文件// File Name: multithread_copy.c// Author: AlexanderGan// Created Time: Mon 29 Jun 2020 03:41:20 PM CST#include<stdio.h>#include<string.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#incl原创 2020-06-29 17:20:26 · 111 阅读 · 0 评论 -
apue学习之利用信号机制让父子进程交替打印
// File Name: parent_child.c// Author: AlexanderGan// Created Time: Mon 22 Jun 2020 09:31:01 PM CST#include<stdio.h>#include<string.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>原创 2020-06-23 11:06:14 · 709 阅读 · 0 评论 -
apue学习之使用setitimer实现alarm函数
apue学习之使用setitimer实现alarm函数1 alarm函数#include<unistd.h>unsigned int alarm(unsigned int seconds);//返回值:0或以前设置的闹钟时间的余留秒数 参数seconds是需要设置的时钟秒数,当时间到达后,内核会产生SIGALRM信号,如果不捕捉或忽略这个信号,系统默认动作是终止调用该alarm函数的进程。 每个进程只能有一个闹钟时间。如果在调用alarm时,之前该进程已经调用过alarm函原创 2020-06-18 15:47:31 · 246 阅读 · 0 评论 -
apue学习之fork函数基础
apue学习之fork函数详解1 函数接口#include<unistd.h>pid_t fork(void);返回值:子进程返回0,父进程返回子进程ID;若出错,返回-1。fork()创建的新进程被称为子进程,fork()调用一次但是返回2次。...原创 2020-06-08 15:18:37 · 265 阅读 · 0 评论 -
apue学习之Linux下遍历指定文件目录的代码实现
// File Name: dircount.c// Author: AlexanderGan// Created Time: Mon 25 May 2020 07:09:10 PM CST#include<stdio.h>#include<string.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>#inc原创 2020-05-28 21:37:23 · 124 阅读 · 0 评论 -
apue学习之Linux文件IO的注意事项
APUE学习之Linux文件IO注意事项标准文件IO访问方式上图是标准文件IO的访问方式,可以看到,在用户的层面和内核的层面都带有缓冲,即使是系统调用如write都会经过高速页缓存,这个时候如果发生宕机那么就可能出现该写入文件的内容由于在高速页缓存中,造成文件丢失。下面用一个例子来模拟:#include <stdio.h>#include <string.h>...原创 2020-05-07 11:53:51 · 143 阅读 · 0 评论 -
深入理解Linux中的内存映射
啊转载 2020-04-24 22:44:43 · 702 阅读 · 0 评论 -
Linux中使用Valgrind进行C/C++内存检测
Linux中的C/C++内存检测1.使用Valgrind工具Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。它包含一个内核,也就是一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。C/C++内存检测,我们可以使用它的工具:Memcheck。安装方法:1)从官网http://valgrind.org下载最新版本(当...原创 2020-04-17 11:15:58 · 426 阅读 · 0 评论 -
Linux系统调用概述与实例分析
Linux系统调用概述与性能分析1.什么是系统调用?系统调用是操作系统提供给用户程序的一组特殊接口,用户程序可以利用这组接口来调用系统服务,例如磁盘I/O会用到的open,write,read等服务。系统调用可以看作内核与用户空间程序交互的接口,把用户进程的请求传递给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。2.为什么需要系统调用?1)将用户与底层硬件隔离,用户不需要了解...原创 2020-04-15 11:14:14 · 1158 阅读 · 0 评论