04 2018 档案

摘要:1 /* 2 * 2.创建4个调用线程,然后主线程每次负责向全局变量box填一个数据,数据填好后4个线程中某个线程将数据 3 * 取出并分析是否包含数字'0' 最后主线程分配完成后 通过取消机制取消取数据的线程 4 */ 5 6 #include 7 #include 8 9 #define NR 4 10 ... 阅读全文
posted @ 2018-04-27 19:42 edan 阅读(628) 评论(0) 推荐(0)
摘要:1.void * mmap((void *addr, size_t length, int prot, int flags, int fd, off_t offset) 参数: addr:用于指定映射存储区的起始地址,通常设置为0,表示由系统自行选择映射地址,函数返 回映射区的起始地址 length 阅读全文
posted @ 2018-04-27 19:16 edan 阅读(189) 评论(0) 推荐(0)
摘要:1.文件锁可以对将要修改文件的某个部分进行加锁,精确控制到字节 通过fcntl()函数来进行设置文件锁 fcntl(int fd,int cmd,.........); 参数:fd:文件描述符 cmd:F_GETLK:测试能否加锁(不过能加也不一定能加上,非原子操作。一般不用) F_SETLK:对文 阅读全文
posted @ 2018-04-27 19:00 edan 阅读(1494) 评论(0) 推荐(0)
摘要:1.初识线程池: 根据任务量预先创建一些线程,阻塞等待,一旦有任务到来,随即唤醒一个空闲的线程执行任务。(自己理解) 根据系统自身的环境情况,有效的限制执行线程的数量,使得运行效果达到最佳。线程主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行。( 阅读全文
posted @ 2018-04-27 11:08 edan 阅读(216) 评论(0) 推荐(0)
摘要:1.阻塞问题的几种解决模型 1.1 非阻塞模型:类似于死循环,需要适当加休眠,防止cpu占用太高;效率较低 1.2 线程异步:效率最高的一种解决方案 1.3 I/O多路转接与复用 select(低) pselect poll(较高) epoll(最高)(linux独有) select(int nfd 阅读全文
posted @ 2018-04-26 17:54 edan 阅读(192) 评论(0) 推荐(0)
摘要:问题:如果只有一个定时器,如何设置多个闹钟,并不使用全局变量、环境变量等传参 解决:拓展定时器信号的处理函数接口,封装一个结构体,存放定时时间sec,定时模式:mod,计时变量count,超时行为func(),行为函数的参数arg, 为了方便后面删除一个闹钟节点,所以需要一个唯一标示,故用每个节点的 阅读全文
posted @ 2018-04-25 19:42 edan 阅读(459) 评论(0) 推荐(0)
摘要:前言: 线程之间资源共享,所以不存在通信问题,但是会有很强烈的竞争问题,解决线程之间的竞争问题有以下几种方法: 注:加锁不要太大,也尽量不要太多,否则会影响效率,读写锁结束最好放弃cpu调度 1.互斥量 功能:保证同一时间只有一个线程可以对共享资源进行操作,但是不保证同步 步骤: 1.1初始化互斥量 阅读全文
posted @ 2018-04-25 19:24 edan 阅读(1944) 评论(0) 推荐(0)
摘要:线程库没有包含在系统库中,编译时要进行链接 gcc -l pthread 线程包括主线程和次线程,线程时平等的,共享数据短,栈空间,唯一不同的是栈空间不同 tid不要打印 2.pthread_cread(tid,&attr,func,&arg) //成功返回0,错误返回错误码 tid:线程id号;a 阅读全文
posted @ 2018-04-25 18:36 edan 阅读(2633) 评论(0) 推荐(0)
摘要:#include <setjmp.h > //注:长跳转语句只能从栈上往下跳,不能从下往上跳。 用途:可以用于超时退出机制 1.setjmp(jmp_buf env) //记录调转点env(最好设置成全局变量) sigsetjmp(sigjmp_buf env, int savesigs) //将s 阅读全文
posted @ 2018-04-25 11:17 edan 阅读(278) 评论(0) 推荐(0)
摘要:1.信号集 每个进程都有一个信号屏蔽字,它规定了当前要阻塞递送到该进程的信号集。对于每种可能的信号,该屏蔽字中都有一bit位与之对应。信号数可能会超过一个整型数所包含的二进制位数,因此POSIX.1定义了一个新数据类型sigset_t,它包括一个信号集 int sigempytset(sigset_ 阅读全文
posted @ 2018-04-24 23:51 edan 阅读(1205) 评论(0) 推荐(0)
摘要:前言:上一篇的处理方法可以解决所有回收问题,但是如果我们不考虑子进程的返回状态,那么可以使内核来进行对子进程的回收 代码如下: //如果无需关心进程结束状态 可以设置子进程结束时不产生僵尸进程有内核值接回收#include <stdio.h>#include <stdlib.h>#include < 阅读全文
posted @ 2018-04-24 19:19 edan 阅读(143) 评论(0) 推荐(0)
摘要:前言:回收子进程之前用了wait()和非阻塞模型,今天学了信号以后可以使回收机制更上一层楼,通过信号函数,父进程只需要做自己的事情,接收到信号后就触发信号函数。 信号处理函数可能会出现的bug: 1.受到停止信号也会触发SIGCHLD信号,使wait阻塞; 2.停止后继续也会触发信号,导致父进程阻塞 阅读全文
posted @ 2018-04-24 19:14 edan 阅读(396) 评论(0) 推荐(0)
摘要:如果两个进程不仅需要同步,还要保证先后执行顺序,就要用两个信号量(互斥锁)来解决 //栅栏模型:实现以下框架中的四个子进程 所有进程做完任务后 在一起执行下一次 #include <stdio.h>#include <unistd.h>#include <sys/types.h>#include < 阅读全文
posted @ 2018-04-24 17:58 edan 阅读(1446) 评论(0) 推荐(0)
摘要:信号量集用于对存在竞争的资源加锁 1.semId=semget(key,nsems,semflg) key:为信号量集名称,可以指定为0455等数字,也可以为PC_PRIVATE nsems:创建几个信号量 semflg:创建并给权限,如(IPC_CREAT | 0600); 2.semctl(se 阅读全文
posted @ 2018-04-22 11:39 edan 阅读(414) 评论(0) 推荐(0)
摘要:消息队列作用: 可以用于两个没有联系的进程间通信,创建一个消息队列类似于打开了一个文件,两个不同的进程都可以进行操作 消息队列之函数介绍: 头文件:<sys/type.h> <sys/ipc.h> <sys/msg.h> 1.msgget(key_t,int msgflg)://创建消息队列 返回值 阅读全文
posted @ 2018-04-21 11:50 edan 阅读(203) 评论(0) 推荐(0)
摘要:1. “\033[s”定位当前光标位置 "\033[u"恢复光标位置 "\033[K" 清除当前行光标后的内容 "\033[C"光标右移 注("\033[1C" 和"\033[0C" 都会右移) "\033[D"光标左移 2. isprintf(ch) 判断是否是可打印字符,包含在头文件<ctype 阅读全文
posted @ 2018-04-20 13:50 edan 阅读(468) 评论(0) 推荐(0)
摘要:1.fork和vfork的区别: 1.vfork()保证子进程先运行,在他调用exec或exit之后父进程才能被调度运行 2.vfork子进程在执行exec或exit之前运行在父进程地址空间。 2.如果多个进程同时结束,可能造成回收不完全,产生僵尸进程(同中信号不派对) 解决方案:利用循环 进行wa 阅读全文
posted @ 2018-04-19 22:42 edan 阅读(113) 评论(0) 推荐(0)
摘要:步骤: 1.设置创建文件屏蔽字 <控制新建文件权限> 2.fork产生孤儿进程 <保证不会是组长进程 确保setsid成功调用> 3.调用setsid脱离控制终端 <脱离控制终端>//建立一个新会话 4.更改工作路径到'/' <防止意外的占用挂载路径 导致无法正常卸载> 5.关闭不用的文件描述符 并 阅读全文
posted @ 2018-04-19 22:31 edan 阅读(491) 评论(0) 推荐(0)
摘要:1.等待回收的两个函数wait()和waitpid()函数 1.1 wait(int *status)的用法:阻塞函数,等待任意一个子进程的返回。 *wait(NULL):对子进程的结束状态不关心; *wait(status) 可以通过statu查看子进程的结束状态。 int statu; wait 阅读全文
posted @ 2018-04-19 19:18 edan 阅读(574) 评论(0) 推荐(0)
摘要:1.父进程创建多个并列的子进程a-->[a1,a2,a3,a4......] 如父进程创建四个子进程,用一个for循环,父进程用来创建子进程,子进程被创建后执行自己的任务。 #define NR 4 for(i=0;i<4;i++) { pid=fork()//child process if(pi 阅读全文
posted @ 2018-04-19 11:15 edan 阅读(155) 评论(0) 推荐(0)
摘要:知识点: 1.当查看手册发现头文件上面有宏定义的要在文件程序的最上方加上该宏定义。 2用到的函数: getpwnam(name);//根据用户输入的name来查找passwd表,看是否有该用户 getspnam(name)//通过用户名在shadow中找到该用户的密钥,返回的是结构体指针 crypt 阅读全文
posted @ 2018-04-18 20:06 edan 阅读(632) 评论(0) 推荐(1)
摘要:1.readlink(pathnam,buf,size) 参数:pathname是一个链接文件名, 功能:该函数的功能是将pathname文件中的路径读到buf中,一共可读size个大小 2.getcwd(buf,zise) 功能:获取当前路径到buf中; 3.chdir(path) 功能:改变当前 阅读全文
posted @ 2018-04-17 18:03 edan 阅读(248) 评论(0) 推荐(0)
摘要:#include<time.h> 1.time(time_t *)//也可以为NULL 返回距离UTC时间的秒数 2.gettimeofday() 可以获得精确的秒和微秒 struct timeval start,end; gettimeofday(&start,NULL);//获取当前时间到sta 阅读全文
posted @ 2018-04-14 18:30 edan 阅读(267) 评论(0) 推荐(0)
摘要:优点:设置标准输入为非阻塞(有数据则读 没有数据则立即返回),常用于网络通信以及轻量信息多并发中 步骤: 1.oldflag=fcntl(STDIN_FILENO,F_GETFL); 获取标准输入的文件打开标志。 2.fcntl(STDIN_FILENO,F_SETFL,oldflag|O_NONB 阅读全文
posted @ 2018-04-14 18:14 edan 阅读(508) 评论(0) 推荐(0)
摘要:比较有用的就两个。 1、获得/设置文件打开状态标志 oldflag=fcntl(fd,F_GETFL); 获得打开文件的状态标志。 arg=oldflag|O_APPEND; fcntl(fd,F_SETFL,arg).//追加文件标志 代码如下: /获取/设置文件打开状态标志#include <s 阅读全文
posted @ 2018-04-14 18:03 edan 阅读(442) 评论(0) 推荐(0)
摘要:通过直接操作驱动来监控键盘,只要程序一旦在后台启动,无论在任何页面都可以监控到按键的数值。 步骤如下: 1.找到键盘挂在点:有两种方法 方法一:在 /dev/input路径下通过 cat even..(1,2,3,4.。)打印操作,并按下键盘看哪个出现的不是回写(乱码状态),就是键盘挂载点,我的是e 阅读全文
posted @ 2018-04-14 12:12 edan 阅读(1866) 评论(0) 推荐(0)
摘要:要想查看一个终端屏幕的大小,可以使用ioctl()函数,步骤如下。 1.首先找到对应终端的文件号,一般在 /dev/pts/....(0,1,2..)。具体几号需要自己验证。如在pts目录下使用命令 (echo "abcde" > 2)将abcde打印到2号终端上。 2,找到终端文件后,以2号为例, 阅读全文
posted @ 2018-04-14 10:42 edan 阅读(558) 评论(0) 推荐(0)
摘要:系统编程第一天: 心得:c语言时标准的I/O操作,可以使用各种平台,如printf,scanf,getc,putc等,都是封装好的函数,给用户调用。 如printf()函数并不是每写一点就打印一点,而是写入缓冲区,显示时行缓冲,够一行就打印。fwrite()也是写入缓冲区,每次写满一页(4k)再调用 阅读全文
posted @ 2018-04-13 22:50 edan 阅读(265) 评论(0) 推荐(0)