netlink怎么读_内核交互 netlink,检测部分进程死亡和启动。

和内核交互netlink

netlink

内核和用户进程交互

用户空间用的是socket,内核空间用的是内部API和一个模块。

向下兼容。

面向数据包的应用。即SOCK_RAW and SOCK_DGRAM

函数原型

#include

#include

#include

netlink_socket = socket(AF_NETLINK, socket_type, netlink_family);

socket_type

SOCK_RAW and SOCK_DGRAM

对于netlink都是一样的。

netlink_family选择内核模块或者说netlink组

NETLINK_ROUTE

接收路由信息,更新链接信息,更新路由表,网络邻居,排队规则,拥塞等等。

NETLINK_SELINUX

linux事件通知

NETLINK_AUDIT

审计模块,用于检测统计内核的操作,比如杀死进程,退出等。aditctl

NETLINK_CONNECTOR

内核链接器5.2版本及以前

netlink包协议栈

一个或多个头部struct nlmsghdr

struct nlmsghdr {

__u32 nlmsg_len; /* Length of message including header */

__u16 nlmsg_type; /* Type of message content */

__u16 nlmsg_flags; /* Additional flags */

__u32 nlmsg_seq; /* Sequence number */

__u32 nlmsg_pid; /* Sender port ID */

};

多个头部则nlmsg_flags是NLM_F_MULTI,最后一个是NLMSG_DONE

nlmsg_type标准的信息类型

没怎么用

nlmsg_flags

NLM_F_REQUEST请求信息

NLM_F_MULTI分片中的其中一个包

proc_event

用于what区分,what的值决定了后面的类型。

共享体先用一个数组进行占位,最大容量。

根据不同的类型也不同。

在linux中有很多这样通过变量+共享体的方式进行存储数据。

TCP/IP协议栈。

signal的回调。

检测audit

支持指令和函数,没有仔细了解。

参考资料

博客

netlink

文件系统

ibm

stackoverflow

/* SPDX-License-Identifier: LGPL-2.1 WITH Linux-syscall-note */

/*

* cn_proc.h - process events connector

*

* Copyright (C) Matt Helsley, IBM Corp. 2005

* Based on cn_fork.h by Nguyen Anh Quynh and Guillaume Thouvenin

* Copyright (C) 2005 Nguyen Anh Quynh

* Copyright (C) 2005 Guillaume Thouvenin

*

* This program is free software; you can redistribute it and/or modify it

* under the terms of version 2.1 of the GNU Lesser General Public License

* as published by the Free Software Foundation.

*

* This program is distributed in the hope that it would be useful, but

* WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

*/

#ifndef _UAPICN_PROC_H

#define _UAPICN_PROC_H

#include

/*

* Userspace sends this enum to register with the kernel that it is listening

* for events on the connector.

*/

enum proc_cn_mcast_op {

PROC_CN_MCAST_LISTEN = 1,

PROC_CN_MCAST_IGNORE = 2

};

/*

* From the user's point of view, the process

* ID is the thread group ID and thread ID is the internal

* kernel "pid". So, fields are assigned as follow:

*

* In user space - In kernel space

*

* parent process ID = parent->tgid

* parent thread ID = parent->pid

* child process ID = child->tgid

* child thread ID = child->pid

*/

struct proc_event {

enum what {

/* Use successive bits so the enums can be used to record

* sets of events as well

*/

PROC_EVENT_NONE = 0x00000000,

PROC_EVENT_FORK = 0x00000001,

PROC_EVENT_EXEC = 0x00000002,

PROC_EVENT_UID = 0x00000004,

PROC_EVENT_GID = 0x00000040,

PROC_EVENT_SID = 0x00000080,

PROC_EVENT_PTRACE = 0x00000100,

PROC_EVENT_COMM = 0x00000200,

/* "next" should be 0x00000400 */

/* "last" is the last process event: exit,

* while "next to last" is coredumping event */

PROC_EVENT_COREDUMP = 0x40000000,

PROC_EVENT_EXIT = 0x80000000

} what;

__u32 cpu;

__u64 __attribute__((aligned(8))) timestamp_ns;

/* Number of nano seconds since system boot */

union { /* must be last field of proc_event struct */

struct {

__u32 err;

} ack;

struct fork_proc_event {

__kernel_pid_t parent_pid;

__kernel_pid_t parent_tgid;

__kernel_pid_t child_pid;

__kernel_pid_t child_tgid;

} fork;

struct exec_proc_event {

__kernel_pid_t process_pid;

__kernel_pid_t process_tgid;

} exec;

struct id_proc_event {

__kernel_pid_t process_pid;

__kernel_pid_t process_tgid;

union {

__u32 ruid; /* task uid */

__u32 rgid; /* task gid */

} r;

union {

__u32 euid;

__u32 egid;

} e;

} id;

struct sid_proc_event {

__kernel_pid_t process_pid;

__kernel_pid_t process_tgid;

} sid;

struct ptrace_proc_event {

__kernel_pid_t process_pid;

__kernel_pid_t process_tgid;

__kernel_pid_t tracer_pid;

__kernel_pid_t tracer_tgid;

} ptrace;

struct comm_proc_event {

__kernel_pid_t process_pid;

__kernel_pid_t process_tgid;

char comm[16];

} comm;

struct coredump_proc_event {

__kernel_pid_t process_pid;

__kernel_pid_t process_tgid;

__kernel_pid_t parent_pid;

__kernel_pid_t parent_tgid;

} coredump;

struct exit_proc_event {

__kernel_pid_t process_pid;

__kernel_pid_t process_tgid;

__u32 exit_code, exit_signal;

__kernel_pid_t parent_pid;

__kernel_pid_t parent_tgid;

} exit;

} event_data;

};

#endif /* _UAPICN_PROC_H */

/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */

#ifndef _UAPI__LINUX_NETLINK_H

#define _UAPI__LINUX_NETLINK_H

#include

#include /* for __kernel_sa_family_t */

#include

#define NETLINK_ROUTE0/* Routing/device hook*/

#define NETLINK_UNUSED1/* Unused number*/

#define NETLINK_USERSOCK2/* Reserved for user mode socket protocols */

#define NETLINK_FIREWALL3/* Unused number, formerly ip_queue*/

#define NETLINK_SOCK_DIAG4/* socket monitoring*/

#define NETLINK_NFLOG5/* netfilter/iptables ULOG */

#define NETLINK_XFRM6/* ipsec */

#define NETLINK_SELINUX7/* SELinux event notifications */

#define NETLINK_ISCSI8/* Open-iSCSI */

#define NETLINK_AUDIT9/* auditing */

#define NETLINK_FIB_LOOKUP10

#define NETLINK_CONNECTOR11

#define NETLINK_NETFILTER12/* netfilter subsystem */

#define NETLINK_IP6_FW13

#define NETLINK_DNRTMSG14/* DECnet routing messages */

#define NETLINK_KOBJECT_UEVENT15/* Kernel messages to userspace */

#define NETLINK_GENERIC16

/* leave room for NETLINK_DM (DM Events) */

#define NETLINK_SCSITRANSPORT18/* SCSI Transports */

#define NETLINK_ECRYPTFS19

#define NETLINK_RDMA20

#define NETLINK_CRYPTO21/* Crypto layer */

#define NETLINK_SMC22/* SMC monitoring */

#define NETLINK_INET_DIAGNETLINK_SOCK_DIAG

#define MAX_LINKS 32

struct sockaddr_nl {

__kernel_sa_family_tnl_family;/* AF_NETLINK*/

unsigned shortnl_pad;/* zero*/

__u32nl_pid;/* port ID*/

__u32nl_groups;/* multicast groups mask */

};

struct nlmsghdr {

__u32nlmsg_len;/* Length of message including header */

__u16nlmsg_type;/* Message content */

__u16nlmsg_flags;/* Additional flags */

__u32nlmsg_seq;/* Sequence number */

__u32nlmsg_pid;/* Sending process port ID */

};

/* Flags values */

#define NLM_F_REQUEST0x01/* It is request message. */

#define NLM_F_MULTI0x02/* Multipart message, terminated by NLMSG_DONE */

#define NLM_F_ACK0x04/* Reply with ack, with zero or error code */

#define NLM_F_ECHO0x08/* Echo this request */

#define NLM_F_DUMP_INTR0x10/* Dump was inconsistent due to sequence change */

#define NLM_F_DUMP_FILTERED0x20/* Dump was filtered as requested */

/* Modifiers to GET request */

#define NLM_F_ROOT0x100/* specify treeroot*/

#define NLM_F_MATCH0x200/* return all matching*/

#define NLM_F_ATOMIC0x400/* atomic GET*/

#define NLM_F_DUMP(NLM_F_ROOT|NLM_F_MATCH)

/* Modifiers to NEW request */

#define NLM_F_REPLACE0x100/* Override existing*/

#define NLM_F_EXCL0x200/* Do not touch, if it exists*/

#define NLM_F_CREATE0x400/* Create, if it does not exist*/

#define NLM_F_APPEND0x800/* Add to end of list*/

/* Modifiers to DELETE request */

#define NLM_F_NONREC0x100/* Do not delete recursively*/

/* Flags for ACK message */

#define NLM_F_CAPPED0x100/* request was capped */

#define NLM_F_ACK_TLVS0x200/* extended ACK TVLs were included */

/*

4.4BSD ADDNLM_F_CREATE|NLM_F_EXCL

4.4BSD CHANGENLM_F_REPLACE

True CHANGENLM_F_CREATE|NLM_F_REPLACE

AppendNLM_F_CREATE

CheckNLM_F_EXCL

*/

#define NLMSG_ALIGNTO4U

#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )

#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))

#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN)

#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))

#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))

#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \

(struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len)))

#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \

(nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \

(nlh)->nlmsg_len <= (len))

#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))

#define NLMSG_NOOP0x1/* Nothing.*/

#define NLMSG_ERROR0x2/* Error*/

#define NLMSG_DONE0x3/* End of a dump*/

#define NLMSG_OVERRUN0x4/* Data lost*/

#define NLMSG_MIN_TYPE0x10/* < 0x10: reserved control messages */

struct nlmsgerr {

interror;

struct nlmsghdr msg;

/*

* followed by the message contents unless NETLINK_CAP_ACK was set

* or the ACK indicates success (error == 0)

* message length is aligned with NLMSG_ALIGN()

*/

/*

* followed by TLVs defined in enum nlmsgerr_attrs

* if NETLINK_EXT_ACK was set

*/

};

/**

* enum nlmsgerr_attrs - nlmsgerr attributes

* @NLMSGERR_ATTR_UNUSED: unused

* @NLMSGERR_ATTR_MSG: error message string (string)

* @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original

* message, counting from the beginning of the header (u32)

* @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to

*be used - in the success case - to identify a created

*object or operation or similar (binary)

* @__NLMSGERR_ATTR_MAX: number of attributes

* @NLMSGERR_ATTR_MAX: highest attribute number

*/

enum nlmsgerr_attrs {

NLMSGERR_ATTR_UNUSED,

NLMSGERR_ATTR_MSG,

NLMSGERR_ATTR_OFFS,

NLMSGERR_ATTR_COOKIE,

__NLMSGERR_ATTR_MAX,

NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1

};

#define NETLINK_ADD_MEMBERSHIP1

#define NETLINK_DROP_MEMBERSHIP2

#define NETLINK_PKTINFO3

#define NETLINK_BROADCAST_ERROR4

#define NETLINK_NO_ENOBUFS5

#ifndef __KERNEL__

#define NETLINK_RX_RING6

#define NETLINK_TX_RING7

#endif

#define NETLINK_LISTEN_ALL_NSID8

#define NETLINK_LIST_MEMBERSHIPS9

#define NETLINK_CAP_ACK10

#define NETLINK_EXT_ACK11

#define NETLINK_GET_STRICT_CHK12

struct nl_pktinfo {

__u32group;

};

struct nl_mmap_req {

unsigned intnm_block_size;

unsigned intnm_block_nr;

unsigned intnm_frame_size;

unsigned intnm_frame_nr;

};

struct nl_mmap_hdr {

unsigned intnm_status;

unsigned intnm_len;

__u32nm_group;

/* credentials */

__u32nm_pid;

__u32nm_uid;

__u32nm_gid;

};

#ifndef __KERNEL__

enum nl_mmap_status {

NL_MMAP_STATUS_UNUSED,

NL_MMAP_STATUS_RESERVED,

NL_MMAP_STATUS_VALID,

NL_MMAP_STATUS_COPY,

NL_MMAP_STATUS_SKIP,

};

#define NL_MMAP_MSG_ALIGNMENTNLMSG_ALIGNTO

#define NL_MMAP_MSG_ALIGN(sz)__ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT)

#define NL_MMAP_HDRLENNL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr))

#endif

#define NET_MAJOR 36/* Major 36 is reserved for networking */

enum {

NETLINK_UNCONNECTED = 0,

NETLINK_CONNECTED,

};

/*

*

* +---------------------+- - -+- - - - - - - - - -+- - -+

* | Header | Pad | Payload | Pad |

* | (struct nlattr) | ing | | ing |

* +---------------------+- - -+- - - - - - - - - -+- - -+

* nla_len -------------->

*/

struct nlattr {

__u16 nla_len;

__u16 nla_type;

};

/*

* nla_type (16 bits)

* +---+---+-------------------------------+

* | N | O | Attribute Type |

* +---+---+-------------------------------+

* N := Carries nested attributes

* O := Payload stored in network byte order

*

* Note: The N and O flag are mutually exclusive.

*/

#define NLA_F_NESTED(1 << 15)

#define NLA_F_NET_BYTEORDER(1 << 14)

#define NLA_TYPE_MASK~(NLA_F_NESTED | NLA_F_NET_BYTEORDER)

#define NLA_ALIGNTO4

#define NLA_ALIGN(len)(((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1))

#define NLA_HDRLEN((int) NLA_ALIGN(sizeof(struct nlattr)))

/* Generic 32 bitflags attribute content sent to the kernel.

*

* The value is a bitmap that defines the values being set

* The selector is a bitmask that defines which value is legit

*

* Examples:

* value = 0x0, and selector = 0x1

* implies we are selecting bit 1 and we want to set its value to 0.

*

* value = 0x2, and selector = 0x2

* implies we are selecting bit 2 and we want to set its value to 1.

*

*/

struct nla_bitfield32 {

__u32 value;

__u32 selector;

};

#endif /* _UAPI__LINUX_NETLINK_H */

/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */

/*

* connector.h

*

* 2004-2005 Copyright (c) Evgeniy Polyakov

* All rights reserved.

*

* This program is free software; you can redistribute it and/or modify

* it under the terms of the GNU General Public License as published by

* the Free Software Foundation; either version 2 of the License, or

* (at your option) any later version.

*

* This program is distributed in the hope that it will be useful,

* but WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

* GNU General Public License for more details.

*

* You should have received a copy of the GNU General Public License

* along with this program; if not, write to the Free Software

* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

*/

#ifndef _UAPI__CONNECTOR_H

#define _UAPI__CONNECTOR_H

#include

/*

* Process Events connector unique ids -- used for message routing

*/

#define CN_IDX_PROC0x1

#define CN_VAL_PROC0x1

#define CN_IDX_CIFS0x2

#define CN_VAL_CIFS 0x1

#define CN_W1_IDX0x3/* w1 communication */

#define CN_W1_VAL0x1

#define CN_IDX_V86D0x4

#define CN_VAL_V86D_UVESAFB0x1

#define CN_IDX_BB0x5/* BlackBoard, from the TSP GPL sampling framework */

#define CN_DST_IDX0x6

#define CN_DST_VAL0x1

#define CN_IDX_DM0x7/* Device Mapper */

#define CN_VAL_DM_USERSPACE_LOG0x1

#define CN_IDX_DRBD0x8

#define CN_VAL_DRBD0x1

#define CN_KVP_IDX0x9/* HyperV KVP */

#define CN_KVP_VAL0x1/* queries from the kernel */

#define CN_VSS_IDX0xA /* HyperV VSS */

#define CN_VSS_VAL0x1 /* queries from the kernel */

#define CN_NETLINK_USERS11/* Highest index + 1 */

/*

* Maximum connector's message size.

*/

#define CONNECTOR_MAX_MSG_SIZE16384

/*

* idx and val are unique identifiers which

* are used for message routing and

* must be registered in connector.h for in-kernel usage.

*/

struct cb_id {

__u32 idx;

__u32 val;

};

struct cn_msg {

struct cb_id id;

__u32 seq;

__u32 ack;

__u16 len;/* Length of the following data */

__u16 flags;

__u8 data[0];

};

#endif /* _UAPI__CONNECTOR_H */

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

enum

{

PROC_EVENT_NONE = 0x00000000,

PROC_EVENT_FORK = 0x00000001,

PROC_EVENT_EXEC = 0x00000002,

PROC_EVENT_UID = 0x00000004,

PROC_EVENT_GID = 0x00000040,

PROC_EVENT_SID = 0x00000080,

PROC_EVENT_PTRACE = 0x00000100,

PROC_EVENT_COMM = 0x00000200,

/* "next" should be 0x00000400 */

/* "last" is the last process event: exit,

* * while "next to last" is coredumping event */

PROC_EVENT_COREDUMP = 0x40000000,

PROC_EVENT_EXIT = 0x80000000

};

/*

* * connect to netlink

* * returns netlink socket, or -1 on error

* */

static int nl_connect()

{

int rc;

int nl_sock;

struct sockaddr_nl sa_nl;

nl_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR);

if (nl_sock == -1) {

perror("socket");

return -1;

}

sa_nl.nl_family = AF_NETLINK;

sa_nl.nl_groups = CN_IDX_PROC;

sa_nl.nl_pid = getpid();

rc = bind(nl_sock, (struct sockaddr *)&sa_nl, sizeof(sa_nl));

if (rc == -1) {

perror("bind");

close(nl_sock);

return -1;

}

return nl_sock;

}

/*

* * subscribe on proc events (process notifications)

* */

static int set_proc_ev_listen(int nl_sock, bool enable)

{

int rc;

struct __attribute__ ((aligned(NLMSG_ALIGNTO))) {

struct nlmsghdr nl_hdr;

struct __attribute__ ((__packed__)) {

struct cn_msg cn_msg;

enum proc_cn_mcast_op cn_mcast;

};

} nlcn_msg;

memset(&nlcn_msg, 0, sizeof(nlcn_msg));

nlcn_msg.nl_hdr.nlmsg_len = sizeof(nlcn_msg);

nlcn_msg.nl_hdr.nlmsg_pid = getpid();

nlcn_msg.nl_hdr.nlmsg_type = NLMSG_DONE;

nlcn_msg.cn_msg.id.idx = CN_IDX_PROC;

nlcn_msg.cn_msg.id.val = CN_VAL_PROC;

nlcn_msg.cn_msg.len = sizeof(enum proc_cn_mcast_op);

nlcn_msg.cn_mcast = enable ? PROC_CN_MCAST_LISTEN : PROC_CN_MCAST_IGNORE;

rc = send(nl_sock, &nlcn_msg, sizeof(nlcn_msg), 0);

if (rc == -1) {

perror("netlink send");

return -1;

}

return 0;

}

#define BUFSIZE 1024

static void getInfo(int);

static void getUserInfo(int pid)

{

char cmd[BUFSIZE] = {0},buf[32]={0};

int len = 0;

bool t = false;

struct utmp *tUser= NULL;

sprintf(buf,"/proc/%d/fd/0",pid);

if(-1 == readlink(buf,cmd,BUFSIZE))

{

printf("link error %d\n",pid);

return ;

}

if( 0 == strncmp(cmd,"/dev/",5) )

{

sprintf(cmd,"%s",cmd+5);

}

while(NULL != (tUser = getutent()))

{

if(7 == tUser->ut_type && 0 != tUser->ut_user[0] && 0 == strcmp(tUser->ut_line,cmd))

{

t = true;

printf("from tty=%s pid=%d IP=%s -- ",tUser->ut_line,pid,tUser->ut_host);

}

}

endutent();

if (!t)

{

printf("from main -- ");

}

getInfo(pid);

}

static void getInfo(int pid)

{

FILE * fp = NULL;

char cmd[BUFSIZE] = {0};

int len = 0;

sprintf(cmd,"/proc/%d/cmdline",pid);

if ( NULL == (fp = fopen(cmd,"r")))

{

printf("%s open error\n",cmd);

return ;

}

if( 0 > (len = fread(cmd,1,BUFSIZE,fp)))

{

printf("%d read error\n",pid);

return;

}

for( int i = 0 ; i < len ; i ++)

{

if(cmd[i] == 0 || cmd[i] == '\n' || cmd[i] == '\r' || cmd[i] == '\t')

{

cmd[i] = ' ';

}

}

cmd[len] = 0;

printf("command %s \n",cmd);

}

#undef BUFSIZE

/*

* * handle a single process event

* */

static volatile bool need_exit = false;

static int handle_proc_ev(int nl_sock)

{

int rc;

struct __attribute__ ((aligned(NLMSG_ALIGNTO))) {

struct nlmsghdr nl_hdr;

struct __attribute__ ((__packed__)) {

struct cn_msg cn_msg;

struct proc_event proc_ev;

};

} nlcn_msg;

while (!need_exit) {

rc = recv(nl_sock, &nlcn_msg, sizeof(nlcn_msg), 0);

if (rc == 0) {

/* shutdown? */

return 0;

} else if (rc == -1) {

if (errno == EINTR) continue;

perror("netlink recv");

return -1;

}

switch (nlcn_msg.proc_ev.what) {

case PROC_EVENT_NONE:

printf("set mcast listen ok\n");

break;

case PROC_EVENT_EXEC:

printf("exec ");

getUserInfo(nlcn_msg.proc_ev.event_data.exec.process_pid);

break;

case PROC_EVENT_EXIT:

printf("exit ");

getUserInfo(nlcn_msg.proc_ev.event_data.exit.process_pid);

break;

default:

break;

}

}

return 0;

}

static void on_sigint(int unused)

{

need_exit = true;

}

int main(int argc, const char *argv[])

{

int nl_sock;

int rc = EXIT_SUCCESS;

signal(SIGINT, &on_sigint);

siginterrupt(SIGINT, true);

nl_sock = nl_connect();

if (nl_sock == -1)

exit(EXIT_FAILURE);

rc = set_proc_ev_listen(nl_sock, true);

if (rc == -1) {

rc = EXIT_FAILURE;

goto out;

}

rc = handle_proc_ev(nl_sock);

if (rc == -1) {

rc = EXIT_FAILURE;

goto out;

}

set_proc_ev_listen(nl_sock, false);

out:

close(nl_sock);

exit(rc);

}

标签:__,netlink,nl,struct,pid,NETLINK,内核,交互,define

来源: https://www.cnblogs.com/98kkkkkkkkkk/p/13324218.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nosuchelementexception 是什么异常_有甲状腺结节的人为什么越来越多?

有甲状腺结节的人为什么越来越多&#xff1f;甲状腺位于人体颈部正前方的位置&#xff0c;在喉结下方&#xff0c;形似蝴蝶&#xff0c;是人体最大的内分泌腺。甲状腺具有分泌甲状腺激素的功能&#xff0c;该激素在人体生长发育和新陈代谢方面扮演着重要角色。那么&#xff0c;…

hdf5编译+linux,在ubuntu上安装HDF5并编译执行

2.2.解压之后&#xff0c;cd hdf5-1.12.0.tar.gz路径3.按以下顺序在终端执行命令&#xff1a;(1)./configure --prefix/usr/local/hdf5 --enable-fortran(2)make(3) make check(检查环境&#xff0c;可选项)(4)sudo make install(5)sudo make check-install(可选项)至此&#x…

mysql5.7和8.0的区别_解答阿迪达斯Adidas ultra boost4.0与正品区别!如何选择?

随着天气渐热&#xff0c;小伙伴们也该换上清爽的鞋子了。说道这里以舒适,透气&#xff0c;踩屎感的adidas ultra boost或许是中高端鞋品最大的赢家。2年多的时间&#xff0c;adidas已经将UltraBOOST打造成了旗下最出色的慢跑鞋&#xff0c;也将它从1.0升级到了4.0。即便是新品…

开关电源环路的零极点可以在反馈端补偿吗_【干货分享】开关电源环路补偿设计步骤讲解...

微信公众号&#xff1a;硬核电子ps&#xff1a;本文撰写过程较为漫长&#xff0c;要画各种示意图和编辑公式&#xff0c;如果你觉得文章不错的话&#xff0c;就请点个赞同吧。​1. 理论讲解在上一篇文章中电子小白菜&#xff1a;【干货分享】轻松弄懂开关电源TL431环路补偿传递…

python实时监控文件大小_python实现实时监控文件的方法

在业务稳定性要求比较高的情况下&#xff0c;运维为能及时发现问题&#xff0c;有时需要对应用程序的日志进行实时分析&#xff0c;当符合某个条件时就立刻报警&#xff0c;而不是被动等待出问题后去解决&#xff0c;比如要监控nginx的$request_time和$upstream_response_time时…

linux 算法函数,数据结构——算法之(012)( linux C 全部字符串操作函数实现)...

数据结构——算法之(012)( linux C 所有字符串操作函数实现)题目&#xff1a;实现linux C下常用的字符串操作函数题目分析&#xff1a;一、面试中可能经常遇到这样的问题&#xff1a;比如strcpy、memcpy、strstr二、参考了linux 内核代码&#xff0c;对linux大神表示感谢&#…

汇编 begin_【精品】小学作文500字汇编九篇

【精品】小学作文500字汇编九篇在我们平凡的日常里&#xff0c;大家或多或少都会接触过作文吧&#xff0c;作文可分为小学作文、中学作文、大学作文(论文)。你所见过的作文是什么样的呢&#xff1f;以下是小编为大家整理的小学作文500字9篇&#xff0c;希望能够帮助到大家。小学…

linux mkdir绝对路径,linux学习(六)绝对路径、相对路径、cd、mkdir、rmdir、rm(示例代码)...

一、绝对路径就是从根开始的&#xff0c;如&#xff1a;/root、/usr/local。二、相对路径相对于当前路径的&#xff0c;比如我们在当前路径下建立了一个a.txt。[[email protected] ~]# pwd/]# ls1.cap 33.txt Application iptables.bak oneinstack shellscripts1.ipt a.php Doc…

python3.6打包成exe可执行文件、已解决方案_Python 3.6打包成EXE可执行程序的实现...

1、下载pyinstallerpython 3.6 已经自己安装了pip&#xff0c;所以只需要执行 pip install pyinstaller就可以了2、打包程序进入到你你需要打包的目录&#xff1b;比如我在H:\xcyk开始打包&#xff0c;执行pyinstaller xxx.py我们发现&#xff0c;竟然报错&#xff01;&#xf…

steam加速_Apex英雄Steam版锁60帧 GoLink免费加速器助力畅快_综合资讯

之前一度爆火的大逃杀游戏《Apex英雄》最近登录了Steam平台&#xff0c;并且支持与Origin平台数据互通。这让很多被烂橘子平台劝退的玩家选择了在Steam平台重新入坑《Apex英雄》&#xff0c;不过由于Steam版刚推出&#xff0c;免不得出现很多问题&#xff0c;很多玩家在进入游戏…

springboot主线程_Springboot对多线程的支持详解

Springboot对多线程的支持详解这两天看阿里的JAVA开发手册&#xff0c;到多线程的时候说永远不要用 new Thread()这种方式来使用多线程。确实是这样的&#xff0c;我一直在用线程池&#xff0c;到了springboot才发现他已经给我们提供了很方便的线程池机制。本博客代码托管在git…

信号灯文件锁linux线程,linux——线程同步(互斥量、条件变量、信号灯、文件锁)...

一、说明linux的线程同步涉及&#xff1a;1、互斥量2、条件变量3、信号灯4、文件读写锁信号灯很多时候被称为信号量&#xff0c;但个人仍觉得叫做信号灯比较好&#xff0c;因为可以与“SYSTEM V IPC的信号量”相区分(如有不同意见&#xff0c;欢迎探讨)。二、互斥量1、定义互斥…

wpf 大数据界面_24小时删!WPF 界面开发可视化数据源500行代码分享

通过DevExpress WPF Controls&#xff0c;您能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。在本教程中&#xff0c;您将完成可视化数据源所需的步骤。应该执行以下步骤&#xff0c;本文我们将为大…

反向题在测试问卷信效度_(完整版)问卷信度效度检验

从统计数据质量角度谈调查问卷的设计质量一、引言从保证统计数据质量的统计工作过程看&#xff0c;统计数据质量可以被划分为统计设计质量、统计调查质量、统计整理质量、统计分析质量以及数据发布传输质量等。统计设计质量是保证统计数据质量的首要环节&#xff0c;在统计数据…

朋友圈加粗字体数字_数字+符码:医院数码导视系统畅想起来

(建筑平面设计图边缘有横竖轴线编码)医院导视系统要做到最简单、最清晰的表达&#xff0c;和谐地融入室内环境并具有一定的弹性&#xff0c;能够适应变化&#xff0c;并适应未来科技的发展&#xff0c;接纳信息化&#xff0c;与管理、服务互联互通。文 | 谷 建 中衡设计集团股…

linux用光盘作yum源实验步骤,Linux使用系统光盘作为YUM源

CentOS 使用方法挂载光盘Linux代码# mkdir /media/cdrom# mount /dev/cdrom /media/cdromyum源文件说明在 /etc/yum.repos.d/ 目录中有CentOS-Base.repo和CentOS-Media.repo两个文件CentOS-Base.repo 记录的是网络上的资源信息CentOS-Media.repo 记录的光盘上的资源信息&#x…

苹果x出现绿线怎么修复_苹果x听筒声音小,苹果x通话声音小怎么办

苹果x听筒声音小&#xff0c;苹果x通话声音小怎么办?相信使用苹果x手机的人大多都会遇见这类情况吧。iPhone手机出现听筒声音小的现象&#xff0c;首先我们要确定出现听筒声音小的故障原因是什么&#xff0c;如果是软件方面的原因造成的&#xff0c;就可以自己调试解决&#x…

wxpython输入框_基于wxPython的GUI实现输入对话框(1)

本文实例为大家分享了基于wxpython的gui实现输入对话框的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下编程时,免不了要输入一些参数等,这时输入对话框就派上用处了:#-*- coding:utf-8 -*-#~ #-------------------------------------------------------------------…

linux grep -11,11个高级Linux字符类和括号表达式的grep命令

你是否曾经在你需要的一种局面搜索字符串&#xff0c;文字或图案的文件里面呢&#xff1f; 如果是&#xff0c;那么grep工具来在这样的情况下派上用场。grep的是为其匹配一个正则表达式搜索行纯文本数据的命令行实用程序。 如果您将分词的grep如 g/re/p&#xff0c;然后grep的含…

tortoisegitpull 并合_tortoiseGIT 本地分支创建合并

接下来是使用tortoiseGIT二、图解使用tortoiseGIT这里只是做一些最基本的功能的演示&#xff1a;创建版本库&#xff0c;提交(commit)文件&#xff0c;推送(push)文件&#xff0c;更新文件&#xff0c;创建分支。简介&#xff1a;git属于分布式版本控制器&#xff0c;其实每个人…