![](https://img-blog.csdnimg.cn/20190123152910589.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
unix编程学习
文章平均质量分 54
这里主要总结了我在学习unix编程的时侯积累的知识以及心得, 同时还包括了自己学习网络编程和进程间编程的一点博客, 后面我可能也会加入一些新的, 希望能和大家一起学习, 探讨, 学习总有很多的不足只有靠大家来纠错误
Function_18
这个作者很懒,什么都没留下…
展开
-
UNIX学习基础
抱歉了, 现在只能做成这样, 因为这是我在vim里面写的笔记再整理的笔记了, 有点随笔, 但是干货还是有点, 看的挺慢的, 借鉴了很多人的知识, 有些不好写也就没有写, 也怕写错, 毕竟自己也才开始. 本来用ATOM写的, 但是, 这玩意居然安不了插件, 无奈这几天才用vim写的. 刚开始看的人估计都跟我一样, 很多不懂, 所以我也查了各种资料, 所以写的很浅显. 以后写的好了再来补充, 我继续整原创 2018-01-21 16:05:22 · 715 阅读 · 0 评论 -
标准I-O流
标准I/O流流流的定向决定了读,写的字符是单字符还是多字符. open函数 fopen : 打开路径名为pathname的文件. freopen : 在一个指定的流上打开依法额指定的文件. 此函数一般用于将一个指定文件打开为一个预订的流 : 标准输入, 标准输入, 标准错误. fdopen : 常用于创建管道, 网络通道函数返回的描述符. 这些特殊的类型原创 2018-01-29 15:44:41 · 423 阅读 · 0 评论 -
进程环境
进程环境起始 int main(int argc, char *argv[]) 当执行程序时, 内核先调用exec函数, 这是一个启动例程 可执行文件将程序的main函数作为了起始地址 最后在从main函数中获得参数和环境变量 当执行一个新的函数时, 调用exec可以将命令行参数传递给一个新的函数进程终止 return 0;原创 2018-01-29 16:59:58 · 286 阅读 · 0 评论 -
select源码分析
select源码分析select源码分析select()core_sys_selectdo_select总结select()函数是从SYSCALL_DEFINE5(select, ...)开始. 可以简单的将SYSCALL_DEFINEx理解为系统定义的系统函数, 如果想了解 SYSCALL_DEFINE 可以看一下.具体的执行流程是 :将时间定义从...原创 2018-05-21 20:58:52 · 1523 阅读 · 0 评论 -
进程控制之fork()与vfork()函数
fork()与vfork()函数标签 : 进程控制大部分来自书上的知识, 然后在网上有些查了掉, 自己再整理了下, 相当于复习, 也写了点自己的理解,不多.进程标识符进程的ID总是唯一的, 所以我们可以将其用作其他标识符保证其唯一性。即,我们在获取进程的ID,也就能够确定其进行的任务, 可以查看进程,也可以杀死进程。(杀掉僵尸进程) 当一个进程终止的时候, ID也就被系统原创 2018-02-01 13:18:10 · 369 阅读 · 0 评论 -
strerror函数
strerror函数在linux编程下, 经常看到很多的函数调用的返回值都会有一句话, 错误代码存放在errno中. 比如 : open() write() creat() 函数就会把错误原因放入errno中. 最开始我也是很纳闷的, 这个是什么啊? 具体怎么看这个错误啊. 后面终于发现, 原来调用一个函数就可以解决了啊, 挺简单的. 就像这样.#include <stdio...原创 2018-05-25 15:58:32 · 5312 阅读 · 0 评论 -
perror函数
perror函数perror函数与strerror函数都是跟errno有关系的函数, 而strerror函数不明白的可以去看一看, 了解一下. 现在, 主要说的是perror.#include<stdio.h> // 头文件#include<stdlib.h>void perror(const char *s); // 函数声明 perror...原创 2018-05-25 16:00:05 · 3905 阅读 · 0 评论 -
exec函数和system()函数
exec函数和system()函数 exec函数和system()函数进程控制关于这一章基本是按照书上的知识写的, 虽然不明白查了一些资料, 但是后面明白了觉得还是书上写的好, 也就没有自己太多的想法,只是整理加深印象而已, 如果只是寻找理解的朋友, 这就不是很有用了。 进程掉用exec时, 该进程执行的程序会完全替换成新的程序, 也就是直接从main函数开始重新执行。 exe原创 2018-02-02 20:24:56 · 822 阅读 · 0 评论 -
signal函数
signal函数 signal函数信号信号是软件中断.#include <signal.h>void (* signal(int signo, void(*func)(int)))(int);// 看起来确实听恐怖的, 不过就是两个参数, 下面来说说具体的参数// 错误返回SIG_ERR signo : 一个信号, 像SIGINT(终止信号), SI...原创 2018-03-05 17:24:10 · 594 阅读 · 0 评论 -
关于SIGHCLD和SIGCLD
关于SIGHCLD和SIGCLD 关于SIGHCLD和SIGCLD信号SIGCLD简单的说, SIGCLD不是可靠信号. 这里的不可靠是指当大量信号来的时候, 重复信号它只会处理一次, 而不是多次. 很多信号在瞬间(“同时”)产生,内核也不一定能够一一处理, 不保证产生的次数.SIGHCLD 如果父进程在fork之后调用wait,就会阻塞,直到有一个子进程退出。如果...原创 2018-03-05 17:25:16 · 2347 阅读 · 1 评论 -
alarm闹钟
alarm闹钟 alarm闹钟信号alarm理解#include <unistd.h>unsigned int alarm(unsigned int seconds)// 返回值 : 0 或者 剩余的时间. 如果在seconds秒内再次调用了alarm函数设置了新的闹钟,则后面定时器的设置将覆盖前面的设置,即之前设置的秒数被新的闹钟时间取代;当参数second...原创 2018-03-05 17:27:00 · 1373 阅读 · 0 评论 -
sigaction
sigaction sigaction信号#include <signal.h> struct sigaction { void (*sa_handler)(int); // 要执行信号的函数指针 void (*sa_sigaction)(int, siginfo_t *, void *); // 信号处理函数 sigs...原创 2018-03-05 17:27:39 · 645 阅读 · 0 评论 -
信号集的操作
信号集的操作 信号集的操作信号信号集的初始操作信号集 : 能够表示多个信号的数据类型#include <signal.h>// 以下函数, 成功, 返回 0; 失败, 返回 -1.int sigemptyset(sigset_t *set) // 清除信号集中的所以信号int sigfillset(sigset_t *set)...原创 2018-03-05 17:26:13 · 695 阅读 · 0 评论 -
线程函數
线程操作(pthread_*) 线程操作(pthread_*)线程一个进程的所有信息对该进程的的所有线程都是共享的, 包括可执行程序的代码, 程序的全局内存和堆内存, 栈以及文件描述符. 所以, 多个线程自动的可以访问相同的存储地址空间和文件描述符 但是, 新的线程会清除原线程的信号集每个线程的ID也是有意义的, 但是仅在它所属的进程上下文才有意义.#include ...原创 2018-03-06 21:49:08 · 327 阅读 · 0 评论 -
线程 锁(一)
线程 锁(一) 线程 锁(一)线程线程同步在变量是只读的时候, 多个线程同时读取该变量都是一样的值. 但是当变量可以修改时, 可能一个变量就会出现多个值.所以为了使同一时间只允许一个线程访问变量, 就要做到线程同步.关于书上的例子, 我找了一篇很不错的博主写的案例, 用汇编来解释的, 讲解了原子操作, 线程同步, 还有自旋锁的观点. 连接 : http://www.cn...原创 2018-03-06 21:49:45 · 431 阅读 · 0 评论 -
线程 锁(二)
线程 锁(二) 线程 锁(二)线程读写锁 当读写锁是加写锁时, 其他试图加写锁的线程都会被阻塞, 加读锁的也会被阻塞到写锁释放为止. 读写锁是加写锁时, 其他试图加写锁的线程可以共享数据. 读写锁的函数#include <pthread.h>// 分配一个读写锁int pthread_rwlock_init(pthread_rwlock_t...原创 2018-03-06 21:50:19 · 300 阅读 · 0 评论 -
线程终止(一)
线程终止(一) 线程终止(一)线程退出码单线程的退出方法 : 从程序中正常退出, 返回线程的退出码. 被同一进程的其他线程取消. 线程调用pthread_exit()函数. #include &lt;pthread.h&gt;void pthread_exit(void *rval ptr)// 从例程中返回, rval_ptr包含返回码. 如果线...原创 2018-03-06 21:51:03 · 509 阅读 · 0 评论 -
线程终止(二)
线程终止(二) 线程终止(二)线程线程清理函数#include <pthread.h>// 进栈void pthread_clreanup_push(void (*rtn)(void *), void *arg)// rtn : 进栈调用的函数// 出栈void pthread_clreanup_pop(int execute)// execute = 0, ...原创 2018-03-07 21:01:02 · 327 阅读 · 0 评论 -
exit()与wait-()函数
exit()与wait*()函数 exit()与wait*()函数进程控制这节的知识我就基本只是把书上的整理了一下, 仅仅只是个人觉得有用的整理了下。exit()函数 _Exit() : 其目的是为进程提供一种无需运行终止处理程序或信号处理程序而终止的方法 _exit() : _exit()由exit()调用,处理UNIX特定的细节 最后一个进程调用return等其他终原创 2018-02-01 13:20:58 · 1301 阅读 · 0 评论 -
exit和return进程调用问题
关于exit与return的区别return 会返回栈, 释放局部变量, 弹出栈. 下列程序的问题 当调用vfork()函数, 因为vfork函数的特点就是子进程与父进程共享数据, 栈等, 而且子进程先执行, 父进程阻塞. 所以当子进程调用结束调用return, 会将进程的栈弹出, 那么父进程执行的时侯, 就会发现已经没有栈了, 所以就会抛出一个错误. ...原创 2018-04-09 19:23:42 · 850 阅读 · 0 评论 -
关于使用线程的排序速度
关于使用线程的排序速度 关于使用线程的排序速度线程用插入排序验证线程进行随机和最坏排序, 以及非线程的随机和最坏排序的时间差距/************************************************************************* > File Name: t.cpp > Author: Function...原创 2018-03-07 21:01:50 · 715 阅读 · 0 评论 -
线程属性
线程属性 线程属性线程ps : 这个线程属性这个真没理解透彻, 也没有找到合理的解释, 所以也不知道怎么解释, 自己感觉直到一些, 却又不知道怎么表达正确, 所以我就尽量写书上的, 而且我也不打算都写, 就里出来一些, 如果是想参考的话, 这一篇就算了吧. 感觉没有任何帮助的.关于线程的属性 : 每个对象与它自己类型的属性对象进行关联. 一个属性对象可以代表多个...原创 2018-03-08 16:22:30 · 905 阅读 · 0 评论 -
关于使用线程的排序速度
关于使用线程的排序速度 关于使用线程的排序速度线程用插入排序验证线程进行随机和最坏排序, 以及非线程的随机和最坏排序的时间差距/************************************************************************* > File Name: t.cpp > Author: Function...原创 2018-03-08 16:23:11 · 452 阅读 · 0 评论 -
共享内存 shmget函数
内核共享内存shmget头文件 函数#include <sys/ipc.h>#include <sys/shm.h>// 得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符int shmget(key_t key, size_t size, int shmflg)// 成功:返回共享内存的标识符; 出错:-1,错误原因存于er...原创 2018-04-09 18:59:07 · 4251 阅读 · 2 评论 -
守护进程
守护进程守护进程 : 是生存长期的一种进程, 他们常常是在系统引导装入时启动, 仅在系统关闭时终止. 他们没有控制终端, 只在后台运行 用户层守护进程的父进程是init进程依照书上的代码创建了一个守护进程/************************************************************************* > File...原创 2018-04-10 21:02:28 · 337 阅读 · 0 评论 -
信号量(一)
信号量P操作 : sv > 0, 则减一. sv == 0, 挂起. V操作 : sv == 0, 则加一. 有等待的就将其唤醒.信号量函数#include <semaphore.h>// sem:信号量的地址。// pshared:等于 0,信号量在线程间共享(常用);不等于0,信号量在进程间共享。// value:信号量的初始值。i...原创 2018-04-10 21:24:24 · 473 阅读 · 0 评论 -
信号量(二)
线程交换执行如果对于信号量的函数不清楚的也可以看这里 : https://blog.csdn.net/function_dou/article/details/79888192使用两个信号量对线程进行阻塞, 执行, 阻塞, 执行. 不断的重复. 从而实现线程的不断的交互使用信号量控制进程的输出, 不断的交替输出./********************************...原创 2018-04-10 21:27:43 · 349 阅读 · 0 评论 -
虚拟文件系统
虚拟文件系统虚拟文件系统索引节点(inode)关于inode结构目录项目录项结构超级块超级块结构总结虚拟文件系统(VFS)是内核子系统, 作为用户空间的文件与文件系统相关的接口. 一个写操作 ret = write(fd, buf, len) write函数系统调用sys_write()函数处理. sys_write函...原创 2018-05-07 13:24:08 · 978 阅读 · 0 评论 -
FIFO 与 共享储存
FIFO 与 共享储存标签(空格分隔): 进程通信FIFO有时被称为命名管道. 管道只能由相关进程使用,但是,通过FIFO,不相关进程也能交换数. FIFO的路径名存在于文件系统中,一般的文件I/O函数都可用于FIFO. FIFO的用途:用于客户进程–服务器进程应用程序中 FIFO的真正优势在于:服务器可以是一个长期运行的进程(例如守护进程),而且与其客户可以无亲缘关系。...原创 2018-05-21 20:24:25 · 731 阅读 · 0 评论 -
I-O操作
I/O操作标签(空格分隔): 标准I/O流散布读 聚集写#include <sys/uio.h>ssize_t readv(int fd, const struct iovc *iov, int iovcnt) // 散布读ssize_t writev(int fd, const struct iovc *iov, int iovcnt) ...原创 2018-05-21 20:27:18 · 581 阅读 · 0 评论 -
映射I-O
映射I/O标签(空格分隔): 标准I/O流存储映射I/O 内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间<—->用户空间两者之间需要大量数据传输等操作的话效率是非常高的。存储映射I/O能将磁盘文件映射到存储空间的一...原创 2018-05-21 20:30:49 · 622 阅读 · 0 评论 -
socket套接字
socket套接字标签(空格分隔): 套接字套接字是通信端点的抽象. socket()函数创建套接字#include <sys/socket.h>int socket(int domain, int type, int protocol)// 成功, 返回 套接字文件描述符; 失败, 返回 -1.参数 :domain : 确定通信的特性. 域( 通常...原创 2018-05-21 20:33:06 · 544 阅读 · 0 评论 -
共享内存 消费生产者-线程
使用线程的属性来实现消费者生产者关于线程的属性, 需要的就是进程间内能够使用的shared属性, 也就是线程的共享. 互斥量属性的数据类型是 pthread_mutexattr_t. 下面两个函数分别用于互斥量属性的初始化与回收。int pthread_mutexattr_init(pthread_mutexattr_t *attr);int pthread_mutexatt...原创 2018-05-21 20:46:43 · 755 阅读 · 0 评论 -
互斥锁 屏障
互斥锁屏障barrier 的数据类型是 pthread_barrier_t.初始化和回收int pthread_barrier_init(pthread *barrier, const pthread_barrier_t *attr, unsigned int count);int pthread_barrier_destroy(pthread_barrier_t *b...原创 2018-05-21 20:49:13 · 664 阅读 · 0 评论 -
epoll源码分析(一)
epoll源码分析(一)epoll源码分析(一)主要数据结构epoll_create()函数实现总结主要数据结构这里讨论的是linux2.6的eventpoll.c文件里面的代码, 所以讲的代码基本都是这个文件的, 其他个别不在里面的代码我已经写出了路径. 这里写的代码后面的描述会用到的数据结构和函数, 这里可以先跳过函数, 只了解一下重要结构体的元...原创 2018-05-22 13:04:12 · 1173 阅读 · 0 评论 -
epoll源码分析(二)
epoll源码分析(二)epoll源码分析(二)epoll_ctl() 函数实现总结epoll_ctl() 函数实现struct ep_pqueue{ poll_table pt; struct epitem *epi;};调用copy_from_user将数据从用户空间拷贝到内核空间通过fget()获得获得epoll_cre...原创 2018-05-23 15:46:58 · 1091 阅读 · 0 评论 -
epoll源码分析(三)
epoll源码分析(三)epoll源码分析(三)epoll_wait函数总结epoll_wait函数SYSCALL_DEFINE4(epoll_wait,…)判断最大值合法性获取匿名文件的文件指针, 取得文件信息调用ep_poll阻塞自己, 等待有消息的到来// epoll_wait()函数的调用SYSCALL_DEFINE4(epo...原创 2018-05-23 15:55:23 · 1119 阅读 · 0 评论