- 博客(24)
- 收藏
- 关注
原创 套接字API
1>int socket(int domain, int type, int protocol);//domain: 网络层 type:传输层 domain:AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用IPv4的地址AF_INET6 与上面类似,不过是来用IPv6的地址AF_UNIX 本地协议,使用在Unix和Linux系统上,一
2016-02-19 17:08:12
448
原创 linux 线程同步 信号量
这里的信号量指的是POSIX 的未命名信号量POSIX的信号量还可用于进程间的同步 这里只说线程的同步信号量的工作方式1 测试信号量是否为02是 休眠 直到 信号量大于0时才可能被唤醒3否 信号量减一测试与减1是一个原子操作 否则会出现减2的事情int sem_init(sem_t *sem, int pshared, unsigned
2016-02-16 17:43:30
349
原创 linux 线程 线程同步
因为线程独自拥有的只有栈,其他的区域线程共同拥有。并且对共享区域的操作并不都是原子的。对共享区域的操作顺序又是不确定的。就像创建两个文件描述符同时指向同一文件,并且连续向文件中写入那么写的东西可能是乱七八糟的。这时就需要线程对共享区的同步。 而另一种情况是,多个线程的指令执行顺序需要同步。(这与访问区域无关,纯粹是指令顺序的方面)临界区: 保证在某一时刻只有一个
2016-02-15 23:36:28
367
原创 linux 线程 线程属性
typedef struct{int etachstate; //线程的分离状态int schedpolicy; //线程调度策略structsched_param schedparam; //线程的调度参数int inheritsched; //线程的继承性int scope; //线程的作用域size_t guardsize; //线程栈末尾的警戒缓冲区大小in
2016-02-14 18:15:49
259
原创 linux 线程 原语套装
1>创建线程int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);pthread_t 线程id结构 (不一定是一个整数 有可能是地址之类的)只保证在本进程中是唯一的值pthread_attr_t
2016-02-13 15:47:36
317
转载 linux 守护进程
守护进程创建步骤1. 创建子进程,父进程退出所有工作在子进程中进行 形式上脱离了控制终端2. 在子进程中创建新会话 setsid()函数 使子进程完全独立出来,脱离控制3. 改变当前目录为根目录 chdir()函数 防止占用可卸载的文件系统 也可以换成其它路径4. 重设文件权限掩码 umask()函数 防止继承的文件创建屏蔽字拒绝
2016-02-11 07:37:54
240
原创 linux 信号 回收子进程
#include #include #include #include #include #include void err(char *name, int err_num){perror(name);exit(err_num);return ;}void fun(int signo){int re;int pid
2016-02-10 15:29:44
1275
原创 linux 信号 sigsuspend abort
int sigsuspend(const sigset_t *mask) //总是返回-1 并将errno设置为EINTR提供了一个原子操作 现将信号屏蔽字设置为mask然后挂起程序 直到捕捉一个信号而且从信号处理程序返回 则sigsuspend返回返回之后 进程屏蔽字会恢复为调用sigsuspend之前的值如果信号终止进程那么挂起也失效void abor
2016-02-09 22:12:40
436
原创 linux 信号 信号集
int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set, int signum); int sigdelset(sigset_t *set, int signum); int s
2016-02-09 18:59:40
421
原创 linux 信号 alarm和pause
unsigned int alarm(unsigned int seconds); 该函数在执行seconds秒之后产生SIGALRM信号,如果忽略或不捕捉这个信号将终止其调用进程。 返回值:0或以前设置闹钟时间的余留秒数 如果以前设置了闹钟并且还未超时 则 alarm(0) 将取消原来的闹钟 并且返回余留的秒数 如果以前设置了闹钟并且
2016-02-09 09:44:13
422
原创 linux 进程间通信 FIFO
创建一个有名管道,解决无血缘关系的进程通信, fifo;创建一个FIFO文件,存储在硬盘上。进程预先知道文件的名字,便可以通过这个标识进行通讯。可以通过函数创建文件int mkfifo(const char *pathname, mode_t mode);可以通过命令mkfifo穿件FIFO文件void err(char *name, int err_num){
2016-02-08 18:33:02
324
原创 linux 信号 中断的系统调用
apue上提到了低速的系统调用 解释很长很麻烦 第三版 260页我只是简单的理解为能够发生阻塞并且阻塞时间够长且有可能永远阻塞的系统调用 当这些函数处于阻塞期,恰好捕捉到一个信号,则该系统调用返回出错,起errno设置为EINTR;而我们希望重启这些函数则出线了这样的代码again:if(( n == read(fd,buf,BUFSIZE)) {i
2016-01-30 18:19:56
353
原创 linux 信号 简介
几种信号的产生:1> 用户按下某些终端键 如 ctrl+c 产生SIGINT中断信号2> 硬件异常 如除数为零3> 别的进程或进程自己发送的信号 如kill命令函数4> 软件信号 如SIGPIPE SIGALRM SIGURG内核对每个信号处理 使用这三种方式1> 忽略此信号 也就是不做任何处理 特殊:2>执行系统默认动作 在进程启动时大部分信
2016-01-30 12:07:35
250
原创 linux 信号 signal函数
typedef void (* fun)(int);fun signal(int signo,fun func); signo: 信号名 func:一个无返回类型 一个int参数的函数指针 若成功这个函数将被安装到内核 当信号递送时内核调用这个函数 说到这里我们看一下三个特殊的函数值 #define SIG_ERR (void (*) (
2016-01-29 21:52:02
304
转载 linux 信号 可重入函数
一、可重入函数1)什么是可重入性?可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。
2016-01-28 20:40:48
801
原创 linux 存储映射
存储映射:能将一个磁盘文件映射到内存空间,我们可以通过指针来使用这个数据。如果设置相应的prot那么我们写内存是,磁盘空间的数据也相应改变。 依赖于这几个函数 mmap(.......) 用于创建一块内存空间 并 与磁盘文件建立联系 mprotect 改变映射地址空间的权限 msync 将内
2016-01-28 11:30:00
1511
原创 linux 进程间通信 pipe
pipe 是有亲属关系的进程之间通信的经典方法 int pipe(int fd[2]); //创建管道的函数 成功返回0 出错返回-1参数fd[2] 作为返回文件描述符的容器 fd[0]为读打开 fd[1]为写打开可以fork子进程 继承文件描述符实现通信 可以fork多个子进程进行通信但是你要有足够的精力管理他们以至于 不会发生混乱所以这样做是不可取的fpa
2016-01-19 13:34:05
293
转载 Linux写时拷贝技术(copy-on-write)
源于网上资料COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。 那么子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢? 在fork之后exe
2016-01-15 20:54:02
273
原创 exec族函数总结
1> execve为系统调用 其他的都是封装的函数l:参数列表 p:在环境变量PATH中寻找 v:参数数组 e:替换环境变量列表返回值:函数出错 返回0 否则不反回(原来的用户区已经被替换 只留下PCB所以没有返回的地方)exec族函数只替换用户区 但是对内核区的PCB也有一定的影响(详见 apue3 p201页)2> 对文件描述符的影响 若打开文件
2016-01-15 20:22:39
503
原创 linux 设置用户id
以前在看 apue 时看到设置用户id有点蒙圈 今天总结一下设置用户id 是文件的一个属性 是st_mode中的一个标志位如果这个位·被 设置为1 那么执行这个文件的时候 此进程的有效用户id就是文件所有者id实验代码#include #include #include #include #include int main()
2016-01-14 20:43:12
563
转载 sudo 在普通用户下使用出错
首先登陆root用户#visudo (注意没有空格)在最后一行添加 your_user_name ALL=(ALL) ALL保存退出
2016-01-14 20:23:09
289
原创 多进程 vfork
#include #include int main(){int test = 0;int pid = 0;if(( pid = vfork()) > 0){printf("%d\n",test);}else if(pid == 0){test += 10;} return 0; }若fork结果
2016-01-04 00:04:28
294
原创 多进程 fork之后父子进程 对文件描述符的作用
#include #include #include #include #include #include int main() {int fd = open("data",O_WRONLY | O_CREAT, 0777); int pid = -1;int stat;if(fd == -1){printf("文件打开
2016-01-03 23:42:13
549
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人