上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 24 下一页

2018年2月27日

命名管道FIFO和mkfifo函数

摘要: 进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的。如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通信呢?内核提供一条通道不成问题,问题是如何标识这条通道才能使各进程都可以访问它?文件系统中的路径名是 阅读全文

posted @ 2018-02-27 10:09 AlanTu 阅读(7336) 评论(0) 推荐(0) 编辑

管道读写规则和Pipe Capacity、PIPE_BUF

摘要: 一、当没有数据可读时 O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。 O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。 示例程序如下: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 阅读全文

posted @ 2018-02-27 10:07 AlanTu 阅读(1638) 评论(0) 推荐(0) 编辑

匿名管道和pipe函数

摘要: 一、进程间通信 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Com 阅读全文

posted @ 2018-02-27 10:04 AlanTu 阅读(1650) 评论(0) 推荐(1) 编辑

竞态条件与sigsuspend函数

摘要: 一、利用pause和alarm函数实现sleep函数 #include <unistd.h> int pause(void); pause函数使调用进程挂起直到有信号递达。如果信号的处理动作是终止进程,则进程终止,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,paus 阅读全文

posted @ 2018-02-27 10:03 AlanTu 阅读(406) 评论(0) 推荐(0) 编辑

实时信号与sigqueue函数

摘要: 一、sigqueue函数 功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用。 原型:int sigqueue(pid_t pid, int sig, const union sigval value); 参数: sigqueue的第一个参数是 阅读全文

posted @ 2018-02-27 10:01 AlanTu 阅读(1225) 评论(0) 推荐(0) 编辑

信号的捕捉与sigaction函数

摘要: 一、内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1. 用户程序注册了SIGQUIT信号的处理函数sighandler。 2. 当前正在执行main函数,这时发生中断或异常切 阅读全文

posted @ 2018-02-27 10:00 AlanTu 阅读(3510) 评论(1) 推荐(0) 编辑

信号的阻塞与未决

摘要: 一、信号在内核中的表示 实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号,SIGKILL 和 SIGSTOP 不能被阻塞。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递 阅读全文

posted @ 2018-02-27 09:58 AlanTu 阅读(1212) 评论(0) 推荐(0) 编辑

一些信号发送函数和不同精度的睡眠

摘要: 一、kill, raise, killpg 函数 int kill(pid_t pid, int sig); int raise(int sig); int killpg(int pgrp, int sig); kill命令是调用kill函数实现的,kill函数可以给一个指定的进程或进程组发送指定的 阅读全文

posted @ 2018-02-27 09:56 AlanTu 阅读(256) 评论(0) 推荐(0) 编辑

信号基本概述

摘要: 一、为了理解信号,先从我们最熟悉的场景说起: 1. 用户输入命令,在Shell下启动一个前台进程。 2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断。 3. 如果CPU当前正在执行这个进程的代码,则该进程的用户空间代码暂停执行,CPU从用户态切换到内核态处理硬件中断。 4. 终端驱动程序将C 阅读全文

posted @ 2018-02-27 09:53 AlanTu 阅读(368) 评论(0) 推荐(0) 编辑

终端、作业控制与守护进程

摘要: 一、终端的概念 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。默认情况 阅读全文

posted @ 2018-02-27 09:50 AlanTu 阅读(465) 评论(0) 推荐(0) 编辑

wait/waitpid函数与僵尸进程、fork 2 times

摘要: 一、僵尸进程 当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态。 A child that term 阅读全文

posted @ 2018-02-27 09:48 AlanTu 阅读(728) 评论(0) 推荐(0) 编辑

exec系列函数和system函数

摘要: 一、exec替换进程映象 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。当我们创建 了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。当然,exec系列的函数也可以将当前进程替换掉。 二、 阅读全文

posted @ 2018-02-27 09:47 AlanTu 阅读(3806) 评论(0) 推荐(0) 编辑

fork函数相关总结

摘要: fork的作用是根据一个现有的进程复制出一个新进程,原来的进程称为父进程(Parent Process),新进程称为子进程(Child Process)。系统中同时运行着很多进程,这些进程都是从最初只有一个进程开始一个一个复制出来的。在Shell下输入命令可以运行一个程序,是因为Shell进程在读取 阅读全文

posted @ 2018-02-27 09:44 AlanTu 阅读(458) 评论(0) 推荐(0) 编辑

文件的内核结构file和dup实现重定向

摘要: 一、打开文件内核数据结构 1、一个进程打开两个文件 文件状态标志:读、写、追加、同步、非阻塞等 2、一个进程两次打开同一文件 3、两个进程打开同一文件 示例程序: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 阅读全文

posted @ 2018-02-27 09:42 AlanTu 阅读(554) 评论(0) 推荐(0) 编辑

进程基本概述

摘要: 一、什么是进程 从用户的角度来看进程是程序的一次执行过程。 从操作系统的核心来看,进程是操作系统分配的内存、CPU时间片等资源的基本单位。 进程是资源分配的最小单位。 每一个进程都有自己独立的地址空间与执行状态。 像UNIX这样的多任务操作系统能够让许多程序同时运行,每一个运行着的程序就构成了一个进 阅读全文

posted @ 2018-02-27 09:40 AlanTu 阅读(555) 评论(0) 推荐(0) 编辑

fcntl 函数与文件锁

摘要: 一、fcntl函数 功能:操纵文件描述符,改变已打开的文件的属性 int fcntl(int fd, int cmd, ... /* arg */ ); cmd的取值可以如下: 复制文件描述符 F_DUPFD (long) 设置/获取文件描述符标志 F_GETFD (void) F_SETFD (l 阅读全文

posted @ 2018-02-27 09:38 AlanTu 阅读(661) 评论(0) 推荐(0) 编辑

文件的属性

摘要: 一、读取文件元数据 int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); int lstat(const char *path, struct stat *buf); stat() sta 阅读全文

posted @ 2018-02-27 09:36 AlanTu 阅读(258) 评论(0) 推荐(0) 编辑

目录的操作

摘要: 一、目录的访问 功能说明:打开一个目录 原型:DIR* opendir(char *pathname); 返回值:打开成功,返回一个目录指针打开失败,则返回NULL 功能说明:访问指定目录中下一个连接的细节 原型:struct dirent* readdir(DIR *dirptr); 返回值:返回 阅读全文

posted @ 2018-02-27 09:35 AlanTu 阅读(147) 评论(0) 推荐(0) 编辑

文件的读取写入

摘要: 一、read系统调用 一旦有了与一个打开文件描述相关连的文件描述符,只要该文件是用O_RDONLY或O_RDWR标志打开的,就可以用read()系统调用从该文件中读取字节 函数原型: ssize_t read(int fd, void *buf, size_t count); 参数: fd :想要读 阅读全文

posted @ 2018-02-27 09:32 AlanTu 阅读(434) 评论(0) 推荐(0) 编辑

文件的打开关闭

摘要: 一、文件描述符 对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的。当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数)。后续对文件的操作只需通过该文件描述符,内核记录有关这个打开文件的信息(file结构体)。 一个进程启动时,默认打开了3个文件,标准输入、标准输出 阅读全文

posted @ 2018-02-27 09:30 AlanTu 阅读(520) 评论(0) 推荐(0) 编辑

浅谈原始套接字 SOCK_RAW 的内幕及其应用(port scan, packet sniffer, syn flood, icmp flood)

摘要: 一、SOCK_RAW 内幕 首先在讲SOCK_RAW 之前,先来看创建socket 的函数: int socket(int domain, int type, int protocol); domain :指定通信协议族(protocol family/address) /usr/include/i 阅读全文

posted @ 2018-02-27 09:28 AlanTu 阅读(1707) 评论(0) 推荐(0) 编辑

socket 请求接收完整的一个http响应(设置recv 接收超时选项SO_RCVTIMEO)

摘要: 在前面的系列网络编程文章中,我们都是使用socket 自己实现客户端和服务器端来互相发数据测试,现在尝试使用socket 客户端发 送http 请求给某个网站,然后接收网站的响应数据。http 协议参考 这里。 代码如下: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 阅读全文

posted @ 2018-02-27 09:22 AlanTu 阅读(3060) 评论(0) 推荐(0) 编辑

posix 条件变量与互斥锁 示例生产者--消费者问题

摘要: 一、posix 条件变量 一种线程间同步的情形:线程A需要等某个条件成立才能继续往下执行,现在这个条件不成立,线程A就阻塞等待,而线程B在执行过程中使这个条件成立了,就唤醒线程A继续执行。 在pthread库中通过条件变量(Condition Variable)来阻塞等待一个条件,或者唤醒等待这个条 阅读全文

posted @ 2018-02-27 09:19 AlanTu 阅读(402) 评论(0) 推荐(0) 编辑

posix 匿名信号量与互斥锁 示例生产者--消费者问题

摘要: 一、posix 信号量 信号量的概念参见这里。前面也讲过system v 信号量,现在来说说posix 信号量。 system v 信号量只能用于进程间同步,而posix 信号量除了可以进程间同步,还可以线程间同步。system v 信号量每次PV操作可以是N,但Posix 信号量每次PV只能是1。 阅读全文

posted @ 2018-02-27 09:17 AlanTu 阅读(933) 评论(0) 推荐(0) 编辑

线程的属性和 线程特定数据 Thread-specific Data

摘要: 一、posix 线程属性 POSIX 线程库定义了线程属性对象 pthread_attr_t ,它封装了线程的创建者可以访问和修改的线程属性。主要包括如下属性: 1. 作用域(scope) 2. 栈尺寸(stack size) 3. 栈地址(stack address) 4. 优先级(priorit 阅读全文

posted @ 2018-02-27 09:14 AlanTu 阅读(762) 评论(0) 推荐(0) 编辑

线程模型、pthread 系列函数 和 简单多线程服务器端程序

摘要: 一、线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型。 (一)、N:1用户线程模型 “线程实现”建立在“进程控制”机制之上,由用户空间的程序库来管理。OS内核完全不知道线程信息。这些线程称为用户空间线程。这些线程都工作在“进 程 阅读全文

posted @ 2018-02-27 09:12 AlanTu 阅读(1598) 评论(0) 推荐(0) 编辑

POSIX 共享内存和 系列函数

摘要: 在前面介绍了system v 共享内存的相关知识,现在来稍微看看posix 共享内存 和系列函数。 共享内存简单来说就是一块真正的物理内存区域,可以使用一些函数将这块区域映射到进程的地址空间进行读写,而posix 共享内存与system v 共享内存不同的是它是用虚拟文件系统(tmpfs)实现的,已 阅读全文

posted @ 2018-02-27 09:04 AlanTu 阅读(821) 评论(0) 推荐(0) 编辑

POSIX 消息队列 和 系列函数

摘要: 一、在前面介绍了system v 消息队列的相关知识,现在来稍微看看posix 消息队列。 posix消息队列的一个可能实现如下图: 其实消息队列就是一个可以让进程间交换数据的场所,而两个标准的消息队列最大的不同可能只是api 函数的不同,如system v 的系列函数是msgxxx,而posix 阅读全文

posted @ 2018-02-27 09:02 AlanTu 阅读(718) 评论(0) 推荐(0) 编辑

2018年2月26日

用信号量实现进程互斥示例和解决哲学家就餐问题

摘要: 一、我们在前面讲进程间通信的时候提到过进程互斥的概念,下面写个程序来模拟一下,程序流程如下图: 即父进程打印字符O,子进程打印字符X,每次打印一个字符后要sleep 一下,这里要演示的效果是,在打印程序的边界有PV操作,故每个进程中间sleep 的时间即使时间片轮转到另一进程,由于资源不可用也不会穿 阅读全文

posted @ 2018-02-26 14:40 AlanTu 阅读(2352) 评论(0) 推荐(0) 编辑

封装一个信号量集操作函数的工具

摘要: 信号量的概念参见这里。 与消息队列和共享内存一样,信号量集也有自己的数据结构: struct semid_ds { struct ipc_perm sem_perm; /* Ownership and permissions */ time_t sem_otime; /* Last semop ti 阅读全文

posted @ 2018-02-26 14:38 AlanTu 阅读(474) 评论(0) 推荐(0) 编辑

System V 共享内存 和 系列函数

摘要: 跟消息队列一样,共享内存也有自己的数据结构,如下: struct shmid_ds { struct ipc_perm shm_perm; /* Ownership and permissions */ size_t shm_segsz; /* Size of segment (bytes) */ 阅读全文

posted @ 2018-02-26 14:36 AlanTu 阅读(333) 评论(0) 推荐(0) 编辑

共享内存简介和mmap 函数

摘要: 一、共享内存简介 共享内存区是最快的IPC形式,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 即每个进程地址空间都有一个共享存储器的映射区,当这块区域都映射到相同的真正的物理地址空间时,可以通过这块区域进行数据交换,例如共享库就是这么实现的,很多进 阅读全文

posted @ 2018-02-26 14:34 AlanTu 阅读(2009) 评论(0) 推荐(0) 编辑

消息队列实现回射客户/服务器和 msgsnd、msgrcv 函数

摘要: 一、msgsnd 和 msgrcv 函数 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 功能:把一条消息添加到消息队列中 原型 int msgsnd(int msqid, const void *msgp, size 阅读全文

posted @ 2018-02-26 14:33 AlanTu 阅读(1488) 评论(0) 推荐(0) 编辑

消息队列内核结构和msgget、msgctl 函数

摘要: 一、消息队列 1、消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 2、每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 3、消息队列与管道不同的是,消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定是先入先出。 4、消息队列也有管道一样的不足,就 阅读全文

posted @ 2018-02-26 14:30 AlanTu 阅读(5933) 评论(0) 推荐(0) 编辑

进程间通信概述

摘要: 一、顺序程序与并发程序特征 顺序程序特征 顺序性 封闭性:(运行环境的封闭性) 确定性 可再现性 并发程序特征 共享性 并发性 随机性 二、进程互斥 1、由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥 2、系统中某些资源一次只允许一个进程使 阅读全文

posted @ 2018-02-26 14:27 AlanTu 阅读(277) 评论(0) 推荐(0) 编辑

通过UNIX域套接字传递描述符和 sendmsg/recvmsg 函数

摘要: 在前面我们介绍了UNIX域套接字编程,更重要的一点是UNIX域套接字可以在同一台主机上各进程之间传递文件描述符。 下面先来看两个函数: #include <sys/types.h> #include <sys/socket.h> ssize_t sendmsg(int sockfd, const s 阅读全文

posted @ 2018-02-26 14:25 AlanTu 阅读(1292) 评论(0) 推荐(0) 编辑

UNIX域套接字编程和socketpair 函数

摘要: 一、UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX D 阅读全文

posted @ 2018-02-26 14:23 AlanTu 阅读(3225) 评论(0) 推荐(1) 编辑

基于UDP协议的网络程序

摘要: 一、下图是典型的UDP客户端/服务器通讯过程 下面依照通信流程,我们来实现一个UDP回射客户/服务器 #include <sys/types.h> #include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t len 阅读全文

posted @ 2018-02-26 14:21 AlanTu 阅读(2387) 评论(0) 推荐(0) 编辑

epoll 系列函数简介、与select、poll 的区别

摘要: 一、epoll 系列函数简介 #include <sys/epoll.h> int epoll_create(int size); int epoll_create1(int flags); int epoll_ctl(int epfd, int op, int fd, struct epoll_e 阅读全文

posted @ 2018-02-26 14:20 AlanTu 阅读(2681) 评论(0) 推荐(0) 编辑

select函数的并发限制和 poll 函数应用举例

摘要: 一、用select实现的并发服务器,能达到的并发数,受两方面限制 1、一个进程能打开的最大文件描述符限制。这可以通过调整内核参数。可以通过ulimit -n来调整或者使用setrlimit函数设置, 但一个系统所能打开的最大数也是有限的,跟内存大小有关,可以通过cat /proc/sys/fs/fi 阅读全文

posted @ 2018-02-26 14:18 AlanTu 阅读(681) 评论(0) 推荐(0) 编辑

上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 24 下一页

导航