Linux编程
文章平均质量分 79
谛听-
线上幽灵
展开
-
eventfd 进程间同步
先打印“parent”,后打印“child”#define _GNU_SOURCE#include <stdio.h>#include <stdlib.h>#include <sys/eventfd.h>#include <unistd.h>#include <sys/wait.h>#include <sched.h&...原创 2019-11-07 15:55:53 · 453 阅读 · 0 评论 -
Linux线程---线程创建、等待、分离、优先级
创建线程,等待线程终止#include <stdio.h>#include <pthread.h>#include <stdlib.h>void f(void){ for(int i=0; i<3; ++i) printf ("This is a pthread.\n");}int main(void){...原创 2018-03-24 16:59:21 · 654 阅读 · 0 评论 -
Linux线程---线程同步互斥:互斥锁
保证一段时间只有一个线程执行代码。 pthread_mutex_lock声明开始使用互斥锁上锁,词汇代码直至调用pthread_mutex_unlock为止,均被上锁,即同一时间只能被一个线程调用执行。当一个线程执行到pthrad_mutex_lock时,如果该锁此时被另一个线程使用,那此线程被阻塞,即程序将等待另一个线程释放此互斥锁。#include <pthread.h>...原创 2018-03-24 18:55:15 · 197 阅读 · 0 评论 -
Linux线程---线程同步互斥:条件变量
使用互斥锁可实现线程间数据的共享和通信,互斥锁的一个明显的缺点是它只有两种状态:锁定和非锁定。二条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。 使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量,相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互...原创 2018-03-24 21:53:32 · 226 阅读 · 0 评论 -
Linux线程---线程同步互斥:信号量
从概念上来说,信号量是一个非负整数计数。信号量通常用来协调对资源的访问,其 中信号计数会初始化为可用资源的数目。然后,线程在资源增加时会增加计数,在删 除资源时会减小计数,这些操作都以原子方式执行。如果信号计数变为零,则表明已无可用资源。计数为零时,尝试减小信号的线程会被 阻塞,直到计数大于零为止。由于信号无需由同一个线程来获取和释放,因此信号可用于异步事件通知,如用于信 号处理程...原创 2018-03-25 10:38:32 · 244 阅读 · 0 评论 -
Linux线程---线程同步互斥:读写锁
读写锁与互斥量的功能类似,对临界区的共享资源进行保护!互斥量一次只让一个线程进入临界区,读写锁比它有更高的并行性。读写锁有以下特点:1.如果一个线程用读锁锁定了临界区,那么其他线程也可以用读锁来进入临界区,这样就可以多个线程并行操作。但这个时候,如果再进行写锁加锁就会发生阻塞,写锁请求阻塞后,后面如果继续有读锁来请求,这些后来的读锁都会被阻塞!这样避免了读锁长期占用资源,防止写锁饥饿!2....原创 2018-03-25 12:07:54 · 213 阅读 · 0 评论 -
Linux线程---线程特定数据
在单线程程序中。我们常常要用到”全局变量”以实现多个函数间共享数据, 然而在多线程环境下。因为数据空间是共享的。因此全局变量也为全部线程所共同拥有。但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却能够跨多个函数访问。POSIX线程库通过维护一定的数据结构来解决问题。这个些数据称为(Thread-specific-data或 TSD)。#include <st...原创 2018-03-25 16:05:54 · 258 阅读 · 0 评论 -
Linux线程---线程结束返回一个复杂的数据结构
#include <stdio.h>#include <pthread.h>#include <malloc.h>typedef struct st{ int key; char *val;}ST;void *f(void *arg){ return arg;}int main(){ pthread_t ...原创 2018-03-25 16:29:15 · 271 阅读 · 0 评论 -
Linux进程通信---管道
管道包括无名管道和有名管道两种,前者用于父进程和子进程间的通信后者用于运行于同一台机,器上的任意两个进程间的通信。 管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等无名管道1、 数据自己读不能自己写。 2、 数据一旦被读走,便不在管道中存在,不可反复读取。 3、 由于管道采用半双工通信方式。因此,数据只...原创 2018-03-26 13:51:50 · 161 阅读 · 0 评论 -
Linux进程通信---消息队列
消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法。与管道不同,进程并没有必要提供自己的同步机制,这是消息队列比起管道的一个巨大优点。坏处在于,与管道类似,在每一个数据块上有一个最大尺寸限制,同时在系统中所有消息队列上的块尺寸上也有一个最大尺寸限制。消息结构由两种方式来限定。第一,他必须小于系统限制,第二,必须以long int开始,这在接收函数中会用作一个消息类型。当我...原创 2018-03-29 21:05:29 · 164 阅读 · 0 评论 -
Linux进程通信---共享内存
概念 共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。共享内存优缺点 由于进程可以直接读写内存,所以效率高。像匿名管道和命名管道通信方式,需要在用户空间和内核空间之间进行数据拷贝,而共享内存通信方式只在内存中操作,要高效得多。另外一方面,由于多个进程...原创 2018-03-31 21:43:35 · 150 阅读 · 0 评论 -
Linux进程通信---信号
概念每个信号都有一个数字编码。中断信号通常是编码2。信号处理函数有点像捕鼠器。一个信号意味着什么具有破坏性的事情发射,并被捕获。信号(signal)是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号)。应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉。进程收到一个信号后,会检查对该信号的处理机制。如果是SIG_IGN,就...原创 2018-04-01 16:04:42 · 167 阅读 · 0 评论 -
Linux进程通信---信号量
信号量是一个内核变量,它可以被系统中的任何进程所访问。进程间可以使用这个变量来协调对于共享内存和其他资源的访问。如果不删除信号量,它将继续在系统中存在,即使程序已经退出,它可能在你下次运行此程序时引发问题,而且信号量是一种有限的资源。简单的例子 父进程与子进程共享打印机,必须其中一者打印完后,另一者再打印。#include <stdio.h>#include <...原创 2018-04-02 20:19:04 · 538 阅读 · 0 评论 -
Linux进程通信---流套接字
服务器端#include <stdio.h>#include <unistd.h>#include <errno.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h>原创 2018-04-03 13:12:58 · 195 阅读 · 0 评论 -
epoll
服务器端#include <fcntl.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/socket.h>#include原创 2018-04-17 13:59:45 · 162 阅读 · 0 评论 -
线程池
在面向对象程序编程中,对象的创建与析构都是一个较为复杂的过程,较费时间,所以为了提高程序的运行效率尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。 所以我们可以创建一个进程池(线程池),预先放一些进程(线程)进去,要用的时候就直接调用,用完之后再把进程归还给进程池,省下创建删除进程的时间,不过当然就需要额外的开销了。 利用线程池与进程池可以使管理进程与线程的工作交给系统...转载 2018-04-17 19:32:16 · 187 阅读 · 0 评论 -
makefile
f1.c#include <stdio.h>void fun1(){ printf("fun1\n");}f2.c#include <stdio.h>void fun2(){ printf("fun2\n");}main.c#include <stdio.h>int main(){ fun...原创 2018-04-17 21:05:39 · 173 阅读 · 0 评论 -
gdb
#include <stdio.h>int nGlobalVar = 0;int tempFunction(int a, int b){ printf("tempFunction is called, a = %d, b = %d /n", a, b); return (a + b);}int main(){ int n; n = 1;...原创 2018-04-27 13:15:24 · 195 阅读 · 0 评论 -
《unix环境高级编程》--- 公共部分
源码下载:http://apuebook.com/code3e.htmlapue.3e/systype.h :判断操作系统类别 apue.3e/Make.defines.linux:平台相关的定义 apue.3e/Make.libapue.inc:执行 “apue/lib/”中Makefileapue.3e/include/apue.h:宏定义和函数声明 apue.3e/lib/:函...原创 2018-05-12 21:35:46 · 301 阅读 · 0 评论 -
《unix环境高级编程》-- Unix基础知识
列出一个目录中的所有文件 ls1.c#include &amp;amp;quot;apue.h&amp;amp;quot;#include &amp;amp;amp;lt;stdio.h&amp;amp;amp;gt;#include &amp;amp;amp;lt;dirent.h&amp;amp;amp;gt;int main(int argc, char *argv[]){ DI原创 2018-05-14 13:33:35 · 513 阅读 · 0 评论 -
《unix环境高级编程》--- Unix标准化及实现
#include "apue.h"#include <errno.h>#include <limits.h>static void pr_sysconf(char *, int);static void pr_pathconf(char *, char *, int);int main(int argc, char *argv[]){ if(argc...原创 2018-05-15 19:40:38 · 178 阅读 · 0 评论 -
《unix环境高级编程》-- 文件I/O
测试能否对标准输入设置偏移量 仅将文件偏移量记录在内核内,不引起任何I/O操作#include "apue.h"int main(void){ /* off_t lseek(int fileds, off_t offet, int whence) 为打开的文件设置偏移量 whence: SEEK_SET SEEK_CUR SEET...原创 2018-05-16 20:06:14 · 205 阅读 · 0 评论 -
《unix环境高级编程》--- 文件和目录
对每个命令函参数打印文件类型#include &amp;quot;apue.h&amp;quot;int main(int argc, char *argv[]){ int i; struct stat buf; char *ptr; for(i=1; i&amp;amp;lt;argc; i++) { printf(&amp;quot;%s: &amp;quo原创 2018-05-16 21:28:29 · 882 阅读 · 0 评论 -
《unix环境高级编程》--- 标志I/O库
用getc和putc将标准输入复制到标准输出#include "apue.h"int main(void){ int c; /* int getc(FILE *fp); 一个读一个字符, 可实现为宏 */ while((c = getc(stdin)) != EOF) { /* ...原创 2018-05-18 20:31:09 · 182 阅读 · 0 评论 -
《unix环境高级编程》--- 系统数据文件和信息
getpwnam函数 给出用户登录名,获取口令文件项#include <pwd.h>#include <stddef.h>#include <string.h>#include <stdio.h>struct passwd *getpwnam(const char *name){ struct passwd *ptr; ...原创 2018-05-19 20:30:44 · 174 阅读 · 0 评论 -
《unix环境高级编程》--- 进程环境
终止码 main中返回一个整型值与用该值调用exit是等价的#include &lt;stdio.h&gt;main(){ printf("hello world\n");}得到的终止码是随机的,取决于main函数返回时栈和寄存器的内容yjp@yjp-VirtualBox:~/apue/7environ$ cc hello1.chello1.c:3:1: warni...原创 2018-05-19 21:36:11 · 366 阅读 · 0 评论 -
《unix环境高级编程》--- 进程控制
进程ID为0的进程通常是调度进程,常被成为交换进程,是内核的一部分,不执行磁盘上的程序,被称为系统进程。 进程ID为1的进程通常是init进程,在自举结束时由内核调用。将系统引导到一个状态。是一个普通的用户进程,而非内核中的系统进程,但以超级用户特权运行。 进程ID为2的进程是守护进程,复制支持虚拟存储系统的分页操作。fork函数示例#include &amp;amp;amp;amp;quot;apue.h&amp;amp;amp;amp;quot;int g原创 2018-05-20 21:14:24 · 309 阅读 · 0 评论 -
《unix环境高级编程》--- 进程关系
会话是一个或多个进程组的集合。作业控制yjp@yjp-VirtualBox:~$ cat > temp.foo & 在后台启动,但从标准输入读,收到SIGTTIN信号[1] 2478yjp@yjp-VirtualBox:~$ 键入回车[1]+ Stopped ...原创 2018-05-22 20:47:19 · 227 阅读 · 0 评论 -
《unix环境高级编程》--- 信号
信号是软件中断。#include &amp;amp;amp;amp;lt;signal.h&amp;amp;amp;amp;gt;void (*signal(int signo, void (*func)(int)))(int);该函数有2各参数,第一个为信号名,第二个为信号处理程序,参数为int。 该函数返回一个参数为int的函数指针,指向func。 以下定义更清楚一些typedef void Sigfunc(int);Sig...原创 2018-05-23 21:17:52 · 450 阅读 · 0 评论 -
《unix环境高级编程》--- 线程
Makefile中添加EXTRALIBS = -pthread打印线程ID#include "apue.h"#include <pthread.h>pthread_t ntid;void printids(const char *s){ pid_t pid; pthread_t tid; pid = getpid(); ti...原创 2018-05-26 18:52:34 · 265 阅读 · 0 评论 -
《unix环境高级编程》--- 线程控制
以分离状态创建的线程 分离状态:父进程不用再管子进程了 :)。#include "apue.h"#include &lt;pthread.h&gt;int makethread(void *(*fn)(void *), void *arg){ int err; pthread_t tid; pthread_attr_t attr; /* ...原创 2018-05-27 12:26:15 · 418 阅读 · 0 评论 -
《unix环境高级编程》--- 守护进程
守护进程也称精灵进程,是生存期较长的一种进程。它们常常在系统自举时启动,仅在系统关闭时才终止。因为它们没有 控制终端,所以说它们是在后台运行的。编写守护进程规则 1、调用umask将文件模式创建屏蔽字设置为0。 2、调用fork,然后使父进程退出。 3、调用setsid创建一个新会话。使调用进程:a、成为新会话的首进程,b、成为一个新进程组的组长进程,c、没有控制终端。 4、将当前工...原创 2018-05-28 19:53:46 · 406 阅读 · 0 评论 -
《unix环境高级编程》--- 高级I/O
长的非阻塞write 从标准输入读500000字节,并试图写到标准输出。先将标准输出设置为非阻塞,然后用for循环输出,每次write调用的结果都在标准出错上打印。#include &quot;apue.h&quot;#include &amp;lt;errno.h&amp;gt;#include &amp;lt;fcntl.h&amp;gt;char buf[500000];int mai原创 2018-05-29 21:05:06 · 4272 阅读 · 0 评论 -
《unix环境高级编程》--- 进程间通信
管道 1、半双工,即数据只能在一个方向上流动。 2、只能在具有公共祖先的进程间使用。下图显示父进程关闭读端(fd[0]),子进程关闭写端(fd[1])后的管道流向。 创建一个从父进程到子进程的管道,由父进程向子进程发送数据。#include "apue.h"int main(void){ int n; int fd[2]; pid_t pid;...原创 2018-05-31 21:34:21 · 2511 阅读 · 0 评论 -
《unix环境高级编程》--- 网络IPC:套接字
打印主机和服务信息 如果由多个协议为指定的主机提供相应的服务,程序性会打印出超过一条的信息。本例中,仅打印IPv4上的协议的地址信息,可在hint中设置ai_family打印限制在AF_INET协议族。#include "apue.h"#include <netdb.h>#include <arpa/inet.h>#if defined(BSD) || de...原创 2018-06-04 13:07:14 · 487 阅读 · 0 评论 -
《unix环境高级编程》--- 高级进程间通信[1]
将一个地址绑定一UNIX域套接字 unix域套接字用于在同一台机器上运行的进程之间的通信。仅仅复制数据,不执行协议处理,不需要添加或删除网络报头,无需计算检验和,不产生顺序号,无需发送确认报文。比因特网域套接字效率更高。 unix域套接字时套接字和管道之间的混合物。 可以命名UNIX域套接字,将其用于无关进程之间。#include "apue.h"#include <sys/...原创 2018-06-07 20:37:51 · 299 阅读 · 0 评论 -
《unix环境高级编程》--- 高级进程间通信[2]
当一个进程向另一个级才能传送一打开的文件描述符时,希望发送进程和接收进程共享同一文件表项。 发送进程实际上向接收进程传送一个指向一打开文件表项的指针。该指针被分配存放在接收进程的第一可用描述符项中,即发送进程和接收进程的描述符编号一般不同。 当发送继承将描述符传送给接收进程后,通常关闭该描述符。发送进程关闭该描述符不造成关闭该文件或设备,因为描述符对应的文件仍被视为由接收进程打开(即接收进程尚...原创 2018-06-08 22:23:29 · 734 阅读 · 0 评论 -
《unix环境高级编程》--- 终端I/O
禁用中断字符和更改文件结束符为Ctrl+B 禁止使用终端驱动程序产生SIGINT信号的特殊字符。但仍可使用kill函数向进程发送该信号。#include "apue.h"#include <termios.h>int main(void){ struct termios term; long vdisable; /* 仅当标准输入是终端设备时...原创 2018-06-10 11:15:39 · 1064 阅读 · 0 评论 -
《unix环境高级编程》--- 伪终端
讲解:https://www.cnblogs.com/zzdyyy/p/7538077.html伪终端对于一个应用程序而言,看上去像一个终端,但事实上伪终端并不是一个真正的终端。从内核角度看,伪终端看起来像一个双向管道,而事实上Solaris的伪终端就是用STREAMS构建的。伪终端总是成对地使用的,就好像是个管道的两端。一端的设备称为”主设备”(master),另一端的设备称为”从设备”(s...原创 2018-06-11 13:20:44 · 1786 阅读 · 0 评论 -
《unix环境高级编程》--- 数据库函数库
讲解:https://blog.csdn.net/cinmyheart/article/details/42094953大多数访问数据库的函数库使用两个文件存储信息:索引文件和数据文件。索引文件包含索引值(键)和指向数据文件中对应数据记录的指针。为提高按键查询的速度和效率,可用散列法和B+树组织索引文件,本文采用固定大小的散列表, 并采用链表法解决散列冲突。 由于只有一个索引文件,所以每条...原创 2018-06-13 21:57:42 · 727 阅读 · 0 评论