狂自私

导航

2018年4月5日 #

Linux:结束线程的三种方式

摘要: 一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL错误。也就是说,如果已经对一个线程调用了pthread_detach就不能再调用pthread_joi... 阅读全文

posted @ 2018-04-05 20:49 狂自私 阅读(27256) 评论(0) 推荐(2) 编辑

Linux:回收循环创建的多个线程

摘要: 上午我说了循环创建多个线程,由于进程与线程是如此的相似,进程我们知道要回收,那么线程也自然要回收啦。我们接着看控制原语: 线程与共享 线程间共享全局变量! 【牢记】:线程默认共享数据段、代码段等地址空间,常用的是全局变量。而进程不共享全局变量,只能借助mmap。 pthread_exit函数 将单个线程退出 void pthread_exit(void *retval);参... 阅读全文

posted @ 2018-04-05 20:49 狂自私 阅读(1944) 评论(0) 推荐(0) 编辑

Linux 循环创建多个线程

摘要: 这里说一下相关的基础知识: 线程概念 什么是线程 LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下) 进程:独立地址空间,拥有PCB 线程:也有PCB,但没有独立的地址空间(共享) 区别:在于是否共享地址空间。独居(进程);合租(线程)。 Linux下:线程:最小的执行单位 ... 阅读全文

posted @ 2018-04-05 20:49 狂自私 阅读(7425) 评论(1) 推荐(0) 编辑

setitimer函数

摘要: 和alarm函数类似,都用于定时操作; 函数原型:int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); 参数:which是指定的定时方式 ①自然定时:ITIMER_REAL → 14)SIGLARM ... 阅读全文

posted @ 2018-04-05 20:48 狂自私 阅读(1150) 评论(0) 推荐(1) 编辑

Linux:使用互斥量进行线程同步

摘要: 基础知识 同步概念 所谓同步,即同时起步,协调一致。不同的对象,对"同步"的理解方式略有不同。如,设备同步,是指在两个设备之间规定一个共同的时间参考;数据库同步,是指让两个或多个数据库内容保持一致,或者按需要部分保持一致;文件同步,是指让两个或多个文件夹里的文件保持一致。等等 而,编程中、通信中所说的同步与生活中大家印象中的同步概念略有差异。"同"字应是指协同、协助、互相配合... 阅读全文

posted @ 2018-04-05 20:48 狂自私 阅读(235) 评论(0) 推荐(0) 编辑

多线程拷贝文件(映射区通讯实现)

摘要: 进程的一般创建我已经学完了,进程之间的通讯四种常用的我也学习了三种,就剩下本地套接字没有学习。现在想用这些知识来完成一个小程序:多线程拷贝文件。 理论上来说,多个线程共同做一件事比单线程做一件同样的事所需时间少。现在来思考一下整体流程是怎样的: 打开(创建)文件(open) 获取文件大小(stat.st_size) 拓展文件(ftruncate()) 建立目标文件映射区(mmap()) 确定创建多... 阅读全文

posted @ 2018-04-05 20:47 狂自私 阅读(510) 评论(0) 推荐(0) 编辑

把所有常规信号的未决状态打印至屏幕

摘要: 信号未决状态,说的实际是未决信号集。即我们要打印输出未决信号集到屏幕上。在此之前,先看看信号集操作函数 int sigemptyset(sigset_t *set); 将某个信号集清0 成功:0;失败:-1 int sigfillset(sigset_t *set); 将某个信号集置1... 阅读全文

posted @ 2018-04-05 20:47 狂自私 阅读(159) 评论(0) 推荐(0) 编辑

SIGCHLD信号

摘要: SIGCHLD的产生条件 子进程终止时 子进程接收到SIGSTOP信号停止时 子进程处在停止态,接受到SIGCONT后唤醒时 也就是说:子进程的运行状态发生变化就会发送SIGCHILD信号;这里的意思时,子进程比较依恋父母,自己发生变化就要给父母说一下。 借助SIGCHLD信号回收子进程 子进程结束运行,其父进程会收到SIGCHLD信号。该信号的默认处理动作是忽略。可以捕捉该信号,在捕捉函数中完成... 阅读全文

posted @ 2018-04-05 20:47 狂自私 阅读(1140) 评论(0) 推荐(0) 编辑

竟态条件(时序竟态)初窥

摘要: 先不管标题,我们先实现一个函数:my_sleep();但在这之前我们需要熟悉一个新系统调用函数:pause(); pause函数 调用该函数可以造成进程主动挂起,等待信号唤醒。调用该系统调用的进程将处于阻塞状态(主动放弃cpu) 直到有信号递达将其唤醒。 int pause(void);失败返回值:-1 并设置errno为EINTR 返回值: ① 如果信号的默认处理... 阅读全文

posted @ 2018-04-05 20:46 狂自私 阅读(730) 评论(0) 推荐(0) 编辑

简洁的实现ls-l命令

摘要: 现在我们来简洁的实现命令:了解一下相关知识: 我们使用掩码可以很明确的得出文件的每一种信息。关于掩码,上图中的S_IRUSR等均为掩码。我们来看看函数getpwuid,原型:struct passwd *getpwuid(uid_t uid);头文件:#include 。getpwuid()用来逐一搜索参数uid 指定的用户识别码, 找到时便将该用户的数据以结构体的形式返回。该函数的返回值是一... 阅读全文

posted @ 2018-04-05 20:46 狂自私 阅读(515) 评论(0) 推荐(0) 编辑

函数mmap()的使用

摘要: 函数mmap是linux的一个系统函数。如下: 函数原型:void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset); 配套函数原型:int munmap(void *addr, size_t length); 头文件:#include 返回值:成功返回创建的映射区的首地址;失败返回宏MAP_FA... 阅读全文

posted @ 2018-04-05 20:46 狂自私 阅读(5933) 评论(0) 推荐(0) 编辑

利用目录函数(opendir,readdir,closedir)查找文件个数

摘要: 如何知道一个目录下的所有文件个数呢?或许可以用tree来学(zhuang)习(bi)的同时知道文件个数。Linux系统io函数为我们提供了目录操作函数,其中有一个比较重要(实际上有三个,因为它们经常配套使用。)。我们可以利用它来递归的读取目录,从而知道指定目录下有多少个文件。下面我来介绍一下: opendir函数: 函数原型:DIR *opendir(const char *name)... 阅读全文

posted @ 2018-04-05 20:45 狂自私 阅读(2289) 评论(0) 推荐(0) 编辑

使用exec函数将当前的信息输入到文件中

摘要: 先来看看exec函数: exec函数族 fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。 将当前进程的.text、.data替换为所要加载的... 阅读全文

posted @ 2018-04-05 20:44 狂自私 阅读(916) 评论(0) 推荐(0) 编辑

实现一个简单的shell

摘要: 使用已学习的各种C函数实现一个简单的交互式Shell,要求:1、给出提示符,让用户输入一行命令,识别程序名和参数并调用适当的exec函数执行程序,待执行完成后再次给出提示符。2、该程序可识别和处理以下符号:1) 简单的标准输入输出重定向:仿照例 "父子进程ls | wc -l",先dup2然后exec。2) 管道(|):Shell进程先调用pipe创建管道,然后fork出两个子进程。一个子进程关闭... 阅读全文

posted @ 2018-04-05 20:44 狂自私 阅读(1793) 评论(0) 推荐(1) 编辑

一秒钟,你的电脑能数多少数?

摘要: 如题,让电脑数数很简单,一个循环就能够搞定,但是如何是在一秒内完成?我们需要一个定时的东西→定时器函数:alarm(); 原型:unsigned int alarm(unsigned int seconds); 返回值:0或者剩下的秒数;无失败返回,即,几乎不出错。 常用于定时(废话),取消前一个定时器。定时器叼啊,自然定时法不管进程是个啥情况(僵尸,就绪,运行,挂起,阻塞,暂停,终止)都计时。 ... 阅读全文

posted @ 2018-04-05 20:42 狂自私 阅读(613) 评论(0) 推荐(0) 编辑

守护进程

摘要: 守护进程 Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。 Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输出机制的实现;ftp服务器;nfs服务器等。 创建守护进程,最关键的一步是调用set... 阅读全文

posted @ 2018-04-05 20:42 狂自私 阅读(301) 评论(0) 推荐(0) 编辑

使用sigaction函数

摘要: sigaction函数 修改信号处理动作(通常在Linux用其来注册一个信号的捕捉函数) int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 成功:0;失败:-1,设置errno 参数: act:传入参数,新的处理方式。oldact:传出参数,旧的处理方式。 stru... 阅读全文

posted @ 2018-04-05 20:42 狂自私 阅读(2336) 评论(0) 推荐(0) 编辑

用waitpid函数回收进程

摘要: waitpid函数:作用同wait,但可指定pid进程清理,可以不阻塞。 原型:pid_t waitpid(pid_t pid, int *status, in options); 返回值:成功时返回清理掉的子进程ID,失败返回-1;当第三个参数被设置为WNOHANG,且子进程还在运行时,返回0; 参数说明: pid > 0回收指定ID的子进程 。 -1回收任意子进程(相当于wait)。 ... 阅读全文

posted @ 2018-04-05 20:41 狂自私 阅读(684) 评论(0) 推荐(0) 编辑

在Linux中简单实现回收子进程

摘要: 学习到wait函数了,这个函数的作用是用来回收进程。一般来说,正常退出的进程是不需要我们来专门回收的。但是进程有这两种:孤儿进程和僵尸进程。 孤儿进程: 通俗点说就是父进程先于子进程死亡。此时子进程就成为孤儿进程。这时候子进程的父进程就是init进程了。这个过程(父进程死亡后子进程的父进程变为init)称为init进程领养孤儿进程。 僵尸进程 进程终止,但是父进程并未进行回收操作。子进程的残留资源... 阅读全文

posted @ 2018-04-05 20:40 狂自私 阅读(513) 评论(0) 推荐(0) 编辑

Linux:使用读写锁使线程同步

摘要: 基础与控制原语 读写锁 与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。 读写锁状态: 一把读写锁具备三种状态: 1. 读模式下加锁状态 (读锁) 2. 写模式下加锁状态 (写锁) 3. 不加锁状态 读写锁特性: 读写锁是"写模式加锁"时, 解锁前,所有对该锁加锁的线程都会被阻塞。 读写锁是"读模式加锁"时, 如果线程以读模式对其加... 阅读全文

posted @ 2018-04-05 19:02 狂自私 阅读(6816) 评论(0) 推荐(0) 编辑