fds

3.管道通信

半世苍凉 提交于 2020-03-10 10:40:39
1.无名管道   pipe  没有实际的文件,只是在内核区域分配一段内存空间来模拟管道,pipe创建无名管道会得到两个文件描述符,一个用来读,一个用来写。   int pipe(int pipefd[2]);//创建管道文件   int fds[2];   int ret=pipe(fds);//fds[0]---读文件描述符  fds[1]---写文件描述符,读取管道文件的时候如果管道中没有数据,则read会阻塞,无名管道只适用于父子进程。 #include <stdio.h> #include <unistd.h> int main() { //创建管道文件 int fds[2]; int ret = pipe(fds); //创建进程 pid_t pid=fork(); if(pid==0){ //关闭读文件描述符 close(fds[0]); //子进程写数据 write(fds[1],"hello world",12); close(fds[1]); } if(pid>0){ //关闭写文件描述符 close(fds[1]); //父进程读取数据 char buf[128]; read(fds[0],buffer,sizeof(buffer)); printf("%s\n",buffer); close(fds[0]); } return 0; } 2.有名管道  

Linux的进程管理

本秂侑毒 提交于 2020-02-27 18:29:12
copy from : http://gityuan.com/2017/08/05/linux-process-fork/ 基于Kernel 4.4源码 kernel/include/linux/sched.h kernel/include/linux/kthread.h kernel/arch/arm/include/asm/thread_info.h kernel/kernel/fork.c kernel/kernel/exit.c kernel/kernel/sched/core.c 一. 概述 Linux创建进程采用fork()和exec() fork: 采用复制当前进程的方式来创建子进程,此时子进程与父进程的区别仅在于pid, ppid以及资源统计量(比如挂起的信号) exec:读取可执行文件并载入地址空间执行;一般称之为exec函数族,有一系列exec开头的函数,比如execl, execve等 fork过程复制资源包括代码段,数据段,堆,栈。fork调用者所在进程便是父进程,新创建的进程便是子进程;在fork调用结束,从内核返回两次,一次继续执行父进程,一次进入执行子进程。 1.1 进程创建 Linux进程创建: 通过fork()系统调用创建进程 Linux用户级线程创建:通过pthread库中的pthread_create()创建线程 Linux内核线程创建:

文件IO之多路复用-poll

回眸只為那壹抹淺笑 提交于 2020-02-21 06:55:47
1.函数原型 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout) 参数1:多个文件描述符的集合,为一个数组指针 struct pollfd{ int fd; // 文件描述符 short events; // 期望监控的文件描述符事件:PLLIN,PLLOUT,PLLERR short revents; // 事件结果:PLLIN,PLLOUT,PLLERR }; 参数2:被监控的文件描述符的个数 参数3:监控的时间,单位为ms,负数表示-无限监控 返回值:负-出错,正-监控到有效事件,0-监控时间到。 2.用法-应用程序中怎么调用poll a.打开要监控的文件,并保存文件描述符到struct follfd fds[]数组中。并将要监控的文件描述符信息填到 fds[]数组中。 struct follfd fds[2]; // 建立要监控的文件描述符数组 // 初始化数组,将要监控的文件描述符信息填入数组。 fds[0].fd = STDIN //打开的文件描述符 fds[0].event = POLLIN //监听的事件 fds[1].fd = STDERR //打开的文件描述符 fds[1].event = POLLIN //监听的事件 b.调用poll函数 int ret = poll

Linux网络编程-IO复用技术

爷,独闯天下 提交于 2020-02-18 22:25:16
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了。Linux中,提供了select、poll、epoll三种接口函数来实现IO复用。 1、select函数 #include <sys/select.h> #include <sys/time.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); // 返回:若有就绪描述符则为其个数,超时为0,出错-1 nfds参数指定了被监听文件描述符的个数,通常设置为监听的所有描述符最大值加1,因为文件描述符是从0开始的。readfs、writefds和exceptfds分别对应可读、可写和异常等事件文件描述符集合,当调用select时,通过这3个参数传入自己感兴趣的文件描述符,select函数返回后,内核通过修改他们来通知应用程序那些文件描述符已经就绪。 fd_set结构体包含一个整形数组,该数组中每一个元素的每一位标记一个文件描述符,fd_set容纳的文件描述符数量由FD_SETSIZE指定,这就限制了select能同时处理的文件描述符最大个数

linux高级编程day10 笔记

妖精的绣舞 提交于 2020-02-04 20:10:32
一.TCP的编程模型 回顾: UDP模型的UML图 TCP模型的UML图 案例1: TCP的服务器(在案例中使用浏览器作为客户程序) socket建立服务器的文件描述符号缓冲 bind把IP地址与端口设置到文件描述符号中 listen负责根据客户连接的不同IP与端口,负责生成对应的文件描述符号及其信息 accept一旦listen有新的描述符号产生就返回,否则阻塞。 View Code //tcpserver.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> main() { int serverfd; int cfd; int a; struct sockaddr_in sadr; struct sockaddr_in cadr; socklen_t len; int r; char buf[1024]; //1.socket serverfd=socket(AF_INET,SOCK_STREAM,0); if(serverfd==-1) printf("1:%m\n"),exit(-1); printf(

关于select中fd限制问题

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-20 03:14:30
关于select中fd限制问题 转载自: http://iredfox.diandian.com/post/2009-10-22/7402106 select 是多路复用,或异步模型中经常用到的一个系统调用。 基本原型为: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 该函数的一个缺点就是nfds 不能太大。上限为1024 .为什么 会有这样的 限制,今天就 来一起看看select的具体实现。 再/usr/include/sys/select.h中可以看到select 使用的基本数据的定义: /* The fd_set member is required to be an array of longs. */ typedef long int __fd_mask ; /* Some versions of <linux/posix_types.h> define these macros. */ #undef __NFDBITS #undef __FDELT #undef __FDMASK /* It's easier to assume 8-bit bytes than to get CHAR_BIT. */ #define

通过Python 的flask,psuti和pyecharts 3个模块实现对服务器指定进程的资源监控服务

╄→尐↘猪︶ㄣ 提交于 2019-12-26 23:10:15
主要思路 1:通过flask 提供两个对外的调用接口(开启监控进程,获取图表结果)实现对给定服务器,指定进程的监控,前端可以发送对服务器多个进程的监控,但是执行后台直允许同时开启5个监控任务。 2:psutil模块是对服务器指定进程的 cpu,mem 文件描述符,实现采集功能。 3:pyecharts是根据每次监控,采集的结果,绘制图表的功能。 import os import time import threading import psutil import json from pyecharts . charts import Line , Page from pyecharts import options as opts from flask import Flask , request app = Flask ( __name__ ) class ProMonitor ( object ) : def __init__ ( self , pro_name , pid = None ) : self . pro_name = pro_name self . pid = pid def __get_psutil_obj ( self ) : """ 查询监控的进程是否有效,并创建psutil对象 :return: 成功返回psutil对象, 失败返回None """ if

vxworks常用API总结

混江龙づ霸主 提交于 2019-12-06 12:38:20
这两天在看VxWorks下的socket网络方面的编程,其中涉及到不少VxWorks下的函数使用,在网上搜了半天觉得这个很不错,于是将其copy下来。最后给出了copy的链接。 vxWorks编程指南 一、官方的Program Guide 位于安装目录下:\docs\vxworks\guide\index.html 二、常用的库: #i nclude "taskLib.h" /* 任务 */ #i nclude "msgQLib.h" /* 消息队列 */ #i nclude "semLib.h" /* 信号量 */ #i nclude "ioLib.h" /* IO */ #i nclude "wdLib.h" /* Watch dog */ #i nclude "logLib.h" /* 信息输出 */ #i nclude "socket.h" /* 网络套接字 */ 三、IO系统:ioLib.h 1、系统中的IO设备,包括键盘、串口、文件等,都用统一的接口访问。第一步通常先得到文件描述符,然后进行读写或者设置的工作,最后关闭该描述符。 creat:建立文件 open:得到文件或设备的描述符 read:读文件或设备 write:写文件或设备 ioctl:设置参数 close:关闭文件描述符 remove:删除文件 2、内存文件 memDrv( ) - 初始化伪内存设备

进程间的通信——pipe通信

萝らか妹 提交于 2019-12-06 06:30:33
进程间的通信分为三种 信号通信,管道通信、socket通信 当进程创建管道文件后,其建立的子进程自动继承该文件。 管道通信分为命名管道和未命名管道,他们的区别是命名管道在当创建他的进程结束后,系统仍存有该文件 管道的命令格式为 pipe(fds) 其中 fds定义为fds[2] fds[0]为读文件描述符,1为写文件描述符 来源: https://www.cnblogs.com/jiangxue2019/p/11965592.html

文件描述符fd,struct files_struct

安稳与你 提交于 2019-12-06 04:16:37
程序可以理解为硬盘上的普通二进制文件;进程是加载到内存中的二进制文件,除了加载到内存中的二进制文件外,还附有所有对于该二进制文件 描述信息的结构体 ,描述该进程的结构体叫 PCB(进程控制块) ,在这就不在讨论。对于程序与进程,也就可以简单地理解为是否有PCB(进程控制块)。下面我们再来讨论PCB与file_struct的关系。 在每一个PCB中,都有一个文件描述符表,通过文件描述符索引指向file_struct(系统打开文件表) 。 文件描述符在形式上是一个非负整数,实际上, 它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表 ,当程序打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。也就是说,一个程序能够访问文件是因为给这个程序分配了文件描述符。 下面我们来讨论file_struct里面具体有哪些内容, file结构体定义在linux系统中的(/kernels/include/linus/fs.h)文件中。 file_struct结构如下 struct file {   union {   struct list_head fu_list; //文件对象链表指针linux/include/linux/list.h   struct rcu_head fu_rcuhead; //RCU(Read-Copy Update)是Linux 2