目录fcntl 声明fcntl功能汇总示例:最常用的将fd设为nonblocking参考
fcntl(file control)提供对文件描述符的各种控制操作。另一个常见控制文件描述符的系统调用是ioctl,提供更多控制。 fcntl提供常用属性和行为的控制,是POSIX规定的首选方法。
本文对fcntl常用操作进行一个简要汇总。
fcntl 声明 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); 参数 fd 被操作的文件描述符; cmd 指定执行何种类型的操作。根据操作类型不同,可能还要第三个可选参数arg。
返回值 成功时,不同的cmd有不同的含义;失败时,返回-1,错误保存至errno。
fcntl功能汇总 操作分类 操作 含义 第三个参数类型 成功时的返回值 复制fd F_DUPFD 创建一个新fd,值 >= arg long 新创建的fd值 F_DUPFD_CLOEXEC 与F_DUPFD类似,不过创建fd同时,设置其close-on-exec标志 long 新创建的fd值 获取和设置fd的标志 F_GETFD 获取fd的标志,如close-on-exec标志 无 fd标志 F_SETFD 设置fd的标志 long 0 获取和设置fd状态标志 F_GETFL 获取fd的状态标志,包括由open系统调用设置的标志(O_APPEND, O_CREAT等)和访问模式(O_RDONLY、O_WRONLY、O_RDWR) void fd状态标志 F_SETFL 设置fd的状态标志,但部分标志不能被修改(如访问模式标志) long 0 管理信号 F_GETOWN 获得SIGIO和SIGURG信号的宿主进程的PID或进程组的组ID 无 信号的宿主进程的PID或进程组的组ID F_SETOWN 设定SIGIO和SIGURG信号的宿主进程的PID或进程组的组ID long 0 F_GETSIG 获取当应用程序被通知fd可读或可写时,是哪个信号通知该事件的 无 信号值,0表示SIGIO F_SETSIG 设置当fd可读或可写时,系统应该触发哪个信号来通知应用程序 long 0 操作管道容量 F_SETPIPE_SZ 设置由fd指定的管道容量,/proc/sys/fs/pipe-size-max 内核参数指定了fcntl能设置的管道容量的上限 long 0 F_GETPIPE_SZ 获取由fd指定的管道容量 无 管道容量 示例:最常用的将fd设为nonblocking int setnonblocking(int fd) { int old_option = fcntl(fd, F_GETFL); /* 获取文件描述符旧状态标志 */ int new_option = old_option | O_NONBLOCK; /* 设置非阻塞标志 */ fcntl(fd, F_SETFL, new_option); /* 修改fd的状态标志 */ return old_option; /* 返回文件描述符旧的状态标志, 便于日后恢复 */ } 参考 《Linux高性能服务器编程》
最近升级6.0后发现手动批量导入Zabbix主机群组需要一个新的uuid参数,于是用powershell写了一个脚本。
代码如下:
<# TIME:2022/04/30 DESCRIPTION:生成zabbix批量导入的XML文件 AUTHOR:Monbro #> # # $zbxiface设置为161为生成SNMP的XML文件,设置10050为ZabbixAgent的XML文件 $zbxiface = 10050 $ppath = Split-Path -Parent $PSCommandPath $xlsxfile = $ppath+\+(Get-ChildItem -Path $ppath\*.xlsx).Name $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $wb=$excel.Workbooks.Open($xlsxfile) $ws=$wb.Sheets.Item(Sheet1) $slist=$iplist=$dplist=$cnlist=@() for ($n = 1; $n -le $ws.UsedRange.Rows.Count; $n++) { #01_Names $slist+=$ws.Cells.Item($n,1).Text #02_IPv4Address $iplist+=$ws.Cells.Item($n,2).Text #03_Description $dplist+=$ws.Cells.Item($n,3).Text #04_CanonicalName $cnlist+=$ws.Cells.Item($n,4).Text } $excel.Quit() $excel = $null [GC]::Collect() $cretedate = Get-Date -Format yyyy-MM-ddThh:mm:ssZ $groupname=$cretedate $groupuuid=[System.Guid]::NewGuid().toString('N') $filename = $ppath+\+$cretedate.
1、如果库里已存在数据库
(1)、appsettings.json下添加连接字符串
ConnectionStrings: { PostgreSql: User ID=postgres;Password=xxx;Host=localhost;Port=5432;Database=xx }, (1)、通过NuGet安装Entity Framework并更新文件project.json中“tools”区
Install-Package Npgsql.EntityFrameworkCore.PostgreSQL Install-Package Npgsql.EntityFrameworkCore.PostgreSQL.Design Install-Package Microsoft.EntityFrameworkCore.Tools -Pre (2)、NuGet包管理器运行命令
Scaffold-DbContext “Server=localhost;Database=xx;User ID=postgres;Password=wantgirl;” Npgsql.EntityFrameworkCore.PostgreSQL -OutputDir Models (3)、已获取数据库表
(4)、startup下注入连接字符串
services.AddDbContext<chdocContext>(option => option.UseNpgsql(Configuration.GetConnectionString(PostgreSql))); (5)、需要操作直接调用方法即可
2、如果表里没有库
(1)在Model文件夹下添加Todoitem类
using System; using System.ComponentModel.DataAnnotations; namespace TodoApi.Models { public class TodoItem { /// <summary> /// 匹配编号 /// </summary> [Key] public Guid Gid { get; set; } /// <summary> /// 上传文件名 /// </summary> public string UploadFileName { get; set; } /// <summary> /// 上传文件路径 /// </summary> public string UploadFilePath { get; set; } /// <summary> /// 创建时间 /// </summary> public DateTime CreateTime { get; set; } /// <summary> /// 状态 0:匹配中 1:匹配完成未下载 2:匹配完成已下载 /// </summary> public int Status { get; set; } /// <summary> /// 下载文件名 /// </summary> public string DownloadFileName { get; set; } /// <summary> /// 下载文件路径 /// </summary> public string DownloadFilePath { get; set; } /// <summary> /// 下载时间 /// </summary> public DateTime?
pymysql
作用:
增、删、改、查、数据库内容。
必要操作:
import pymysql 帮助查看:
help(pymysql) 或 单独查看某个方法(函数)
help(pymysql.cursor) 方法(函数):
1.connect 链接数据库
db=pymysql.connect(host='192.168.83.144',user='ideal',password='ideal',port=3306,db='entegor') 2.打印数据库版本信息和IP信息
print(db.get_server_info(),db.get_host_info()) 3.execute向数据库执行一条命令,插入一行数据:
方式一:
cur.execute(INSERT INTO testdb(FIRST_NAME) VALUES ('Mac')) 方式二:
sql_1 = CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT ) cur.execute(sql_1) 方式三:
sql_2= INSERT INTO testdb(FIRST_NAME) VALUES (%s) % ('Mac') cur.execute(sql_2) 4.executemany向数据库执行一条命令,插入多行数据:
sql_3= INSERT INTO testdb(FIRST_NAME,LAST_NAME, AGE, SEX, INCOME) VALUES(%s, %s, %s, %s, %s) list03= [ ('Mac1', 'Mohan1', 21, 'M', 2001), ('Mac2', 'Mohan2', 22, 'M', 2002), ('Mac3', 'Mohan3', 23, 'M', 2003) ] cur.
进程间通信:管道 在两个进程间发送消息的非常简单的方法:使用信号。我们创建通知事件,通过它引起响应,但传送的信息只限于一个信号值。
这里介绍管道,通过它进程之间可以交换更加有用的数据。
popen与pcolse 最简单的在两个程序之间传递数据的方法就是使用popen和pclose函数
#include <stdio.h> FILE* popen(const char* command,const char* open_mode); int pclose(FILE* stream_to_close); 1.popen 函数
允许一个程序将另一个程序作为新进程来启动。
如果open_mode为“r”,则代表本进程读取被调用程序的输出。
如果open_mode为“w”,则代表被调用程序使用本进程的输出。
注意:如果想通过管道实现双向通信,最简单的解决办法就是使用两个管道,每个管道负责一个方向的数据流。
2.pclose函数
如果被调用程序还没有结束就调用pclose函数,则pclose调用等待该程序的结束。
如果调用进程在调用pclose之前执行了一个wait语句,被调用进程的退出状态就会丢失,因为被调用进程已经 结束。此时,pclose将返回-1并设置errno为ECHILD
读取外部程序的输入
1 #include <unistd.h> 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include <string.h> 5 6 int main() 7 { 8 FILE * read_fp; 9 char buffer[BUFSIZ+1]; 10 int chars_read; 11 memset(buffer,'\0',sizeof(buffer)); 12 read_fp=popen(uname -a,r); 13 if(read_fp!=NULL){ 14 chars_read=fread(buffer,sizeof(char),BUFSIZ,read_fp); 15 if(chars_read>0){ 16 printf(output was:-\n%s\n,buffer); 17 } 18 pclose(read_fp); 19 exit(EXIT_SUCCESS); 20 } 21 exit(EXIT_FAILURE); 22 } 将输出送往popen
1、客户端可以订阅频道如下图:
当给这个频道发布消息后,消息就会发送给订阅的客户端:
2、实现
1)打开一个客户端订阅 channel1:
2)打开另一个客户端,给 channel1 发布消息 hello:
3)打开第一个客户端可以看到发送的消息
create function [dbo].[ft_get_recursion_deptlist]( @deptcode nvarchar(20),--部门代码 @direction bit =0 --递归方向 0表示向上,1表示向下 --@showDelete bit =0--0表示不显示删除部门,1表示显示删除部门 ) returns @result table(DeptName nvarchar(50),DeptCode nvarchar(30),ParentDeptCode nvarchar(30),DeptCategoryCode nvarchar(20), DeptCategory nvarchar(50),id int ,CostCode nvarchar(30) , ProfitCode nvarchar(30),managerEmpCode nvarchar(10),managerJobCode nvarchar(20), managerPostCode nvarchar(20),deptpath nvarchar(500),IsProdDept bit ,IsOrderProdDept bit,IsIndependent varchar(1), BUCode nvarchar(30),Companyid nvarchar(10),DeleteFlag varchar(1)) as begin if(@direction=0) begin --向上递归,获取指定部门向上的所有部门 WITH deptlist AS ( SELECT a.deptName,a.deptcode,a.parentdeptcode,a.DeptCategoryCode,a.DeptCategory,a.id, a.CostCode,a.ProfitCode , a.Manager_EmployeeCode,a.Manager_JobCode,a.Manager_PositionCode, cast(a.deptcode as nvarchar(4000)) AS PATH, a.IsProdDept ,a.IsOrderProdDept,isnull(a.IsIndependent,'N') as IsIndependent, case when a.DeptCategoryCode='BU' then a.deptcode else isnull((select bucode from ft_get_bucode(a.
docker run \ -p 3306:3306 \ --name mysql \ -v /docker/mysql/conf:/etc/mysql/conf.d \ -v /docker/mysql/logs:/logs \ -v /docker/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.7 # 把容器id替换成你自己的 docker exec -it id /bin/bash # 也可以直接使用下面的命令,效果一样 docker exec -it mysql /bin/bash
create procedure sys.sp_helptext @objname nvarchar(776) ,@columnname sysname = NULL as set nocount on declare @dbname sysname ,@objid int ,@BlankSpaceAdded int ,@BasePos int ,@CurrentPos int ,@TextLength int ,@LineId int ,@AddOnLen int ,@LFCR int --lengths of line feed carriage return ,@DefinedLength int /* NOTE: Length of @SyscomText is 4000 to replace the length of ** text column in syscomments. ** lengths on @Line, #CommentText Text column and ** value for @DefinedLength are all 255.
1、概述
Redis hash 是一个键值对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。类似 Java 里面的 Map<String,Object>。
用户 ID 为查找的 key,存储的 value 用户对象包含姓名,年龄,生日等信息,如果用普通的 key/value 结构来存储,主要有以下 2 种存储方式:
方法一:每次修改用户的某个属性需要,先反序列化改好后再序列化回去。开销较大。
方法二:用户 ID 数据冗余。
通过 key (用户 ID) + field (属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。
2、相关操作
hset key field value----------将key的hash表中的字段field设值为value(由field和关联的value组成的map),字段不存在则生成,存在则覆盖(相当于更新) hmset key field1key field1value [field2key field2value …]----------同时为key的hash表设置多个字段与值 hsetnx key field value--------------只有字段field不存在是,将key的hash表中添加字段field并设值为value hgetall key---------获取key中所有的字段和值 hexists key field-------------key中是否存在指定的字段返回integer,1-存在,0-不存在 hget key field---------------获取key中指定字段的值 hmget key field1 [field2…]----------------获取所有给定字段的值 hkeys key-------------获取key中的所有字段 hlen key-----------key的字段数量,返回integer hvals key---------------获取hash表中所有值 hdel key field1 [field2]-------------删除一个或多个hash字段 3、数据结构