随笔分类 -  系统编程

摘要:1.程序就是编译出来的镜像,处于执行状态的程序叫进程.一个程序可以执行多次,每次执行会产生一个进程. 2. 程序镜像里有分成很多个段: 段其实就是在程序镜像文件里从一个位置到另一个位置范围里存放某种数据,便于系统在加载程序生成进程时的处理. 我们最需要注意的段:.text .rodata .data 阅读全文
posted @ 2018-05-22 12:34 edan 阅读(327) 评论(0) 推荐(0)
摘要:epoll一共需要三步: //声明epoll类型的结构体,ev位要设置的变量,rev位返回时设置变量 1. 创建epoll机制 int epfd; struct epoll_event ev, rev[count]; epfd=epoll_create1(0)//参数为0或EPOLL_CLOEXEC 阅读全文
posted @ 2018-05-21 14:28 edan 阅读(195) 评论(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 阅读(197) 评论(0) 推荐(0)
摘要:1.文件锁可以对将要修改文件的某个部分进行加锁,精确控制到字节 通过fcntl()函数来进行设置文件锁 fcntl(int fd,int cmd,.........); 参数:fd:文件描述符 cmd:F_GETLK:测试能否加锁(不过能加也不一定能加上,非原子操作。一般不用) F_SETLK:对文 阅读全文
posted @ 2018-04-27 19:00 edan 阅读(1503) 评论(0) 推荐(0)
摘要:1.初识线程池: 根据任务量预先创建一些线程,阻塞等待,一旦有任务到来,随即唤醒一个空闲的线程执行任务。(自己理解) 根据系统自身的环境情况,有效的限制执行线程的数量,使得运行效果达到最佳。线程主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行。( 阅读全文
posted @ 2018-04-27 11:08 edan 阅读(221) 评论(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 阅读(197) 评论(0) 推荐(0)
摘要:前言: 线程之间资源共享,所以不存在通信问题,但是会有很强烈的竞争问题,解决线程之间的竞争问题有以下几种方法: 注:加锁不要太大,也尽量不要太多,否则会影响效率,读写锁结束最好放弃cpu调度 1.互斥量 功能:保证同一时间只有一个线程可以对共享资源进行操作,但是不保证同步 步骤: 1.1初始化互斥量 阅读全文
posted @ 2018-04-25 19:24 edan 阅读(1956) 评论(0) 推荐(0)
摘要:线程库没有包含在系统库中,编译时要进行链接 gcc -l pthread 线程包括主线程和次线程,线程时平等的,共享数据短,栈空间,唯一不同的是栈空间不同 tid不要打印 2.pthread_cread(tid,&attr,func,&arg) //成功返回0,错误返回错误码 tid:线程id号;a 阅读全文
posted @ 2018-04-25 18:36 edan 阅读(2648) 评论(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 阅读(288) 评论(0) 推荐(0)
摘要:1.信号集 每个进程都有一个信号屏蔽字,它规定了当前要阻塞递送到该进程的信号集。对于每种可能的信号,该屏蔽字中都有一bit位与之对应。信号数可能会超过一个整型数所包含的二进制位数,因此POSIX.1定义了一个新数据类型sigset_t,它包括一个信号集 int sigempytset(sigset_ 阅读全文
posted @ 2018-04-24 23:51 edan 阅读(1210) 评论(0) 推荐(0)
摘要:前言:上一篇的处理方法可以解决所有回收问题,但是如果我们不考虑子进程的返回状态,那么可以使内核来进行对子进程的回收 代码如下: //如果无需关心进程结束状态 可以设置子进程结束时不产生僵尸进程有内核值接回收#include <stdio.h>#include <stdlib.h>#include < 阅读全文
posted @ 2018-04-24 19:19 edan 阅读(145) 评论(0) 推荐(0)
摘要:前言:回收子进程之前用了wait()和非阻塞模型,今天学了信号以后可以使回收机制更上一层楼,通过信号函数,父进程只需要做自己的事情,接收到信号后就触发信号函数。 信号处理函数可能会出现的bug: 1.受到停止信号也会触发SIGCHLD信号,使wait阻塞; 2.停止后继续也会触发信号,导致父进程阻塞 阅读全文
posted @ 2018-04-24 19:14 edan 阅读(408) 评论(0) 推荐(0)
摘要:如果两个进程不仅需要同步,还要保证先后执行顺序,就要用两个信号量(互斥锁)来解决 //栅栏模型:实现以下框架中的四个子进程 所有进程做完任务后 在一起执行下一次 #include <stdio.h>#include <unistd.h>#include <sys/types.h>#include < 阅读全文
posted @ 2018-04-24 17:58 edan 阅读(1450) 评论(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 阅读(426) 评论(0) 推荐(0)
摘要:消息队列作用: 可以用于两个没有联系的进程间通信,创建一个消息队列类似于打开了一个文件,两个不同的进程都可以进行操作 消息队列之函数介绍: 头文件:<sys/type.h> <sys/ipc.h> <sys/msg.h> 1.msgget(key_t,int msgflg)://创建消息队列 返回值 阅读全文
posted @ 2018-04-21 11:50 edan 阅读(215) 评论(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 阅读(473) 评论(0) 推荐(0)
摘要:1.fork和vfork的区别: 1.vfork()保证子进程先运行,在他调用exec或exit之后父进程才能被调度运行 2.vfork子进程在执行exec或exit之前运行在父进程地址空间。 2.如果多个进程同时结束,可能造成回收不完全,产生僵尸进程(同中信号不派对) 解决方案:利用循环 进行wa 阅读全文
posted @ 2018-04-19 22:42 edan 阅读(119) 评论(0) 推荐(0)
摘要:步骤: 1.设置创建文件屏蔽字 <控制新建文件权限> 2.fork产生孤儿进程 <保证不会是组长进程 确保setsid成功调用> 3.调用setsid脱离控制终端 <脱离控制终端>//建立一个新会话 4.更改工作路径到'/' <防止意外的占用挂载路径 导致无法正常卸载> 5.关闭不用的文件描述符 并 阅读全文
posted @ 2018-04-19 22:31 edan 阅读(497) 评论(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 阅读(584) 评论(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 阅读(160) 评论(0) 推荐(0)