Linux常用库函数

2023-11-15

目录

1 getopt()

2 getopt_long()

3 dlopen()

4 分区信息和文件属性

4.1  fstatfs/statfs

4.2 statvfs/fstatvfs 

4.3 stat/fstat


1 getopt()

getopt被用来解析命令行选项参数,就不用自己处理argv了。

头文件:#include <unistd.h>

原型:int getopt(int argc, char * const argv[], const char *optstring);

参数:optstring - 选项字符串

  1. 单个字符,表示选项;
  2. 单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg;
  3. 单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。

     例1:optstring为"a:b:cd::e"。对应到命令行就是-a ,-b ,-c ,-d, -e ;其中a b d后面有冒号,则后面必须跟一个参数;而c e后面没有冒号,所有不用跟参数。比如-a 11或-a11,11表示a的参数。           

头文件与之相关变量(不用自己定义,直接使用):

  1. extern char *optarg; //选项的参数指针

  2. extern int optind, //下一个检索位置:下一次调用getopt的时,从optind存储的位置处重新开始检查选项。

  3. extern int opterr, //是否将错误信息输出到stderr:当opterr=0时,getopt不向stderr输出错误信息。

  4. extern int optopt; //不在选项字符串optstring中的选项:当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt中,getop()返回'?’、

例1:

#include <stdio.h>
#include <unistd.h>
 
int main(int argc, char **argv)
{
    int ch;
 
    while( (ch = getopt(argc, argv, "ab:c::")) != -1 )
    {
           switch(ch)
          {
               case 'a':
                   printf("option = a, optopt = %c, optarg = %s\n", optopt, optarg);
                   break;
              case 'b':
                   printf("option = b, optopt = %c, optarg = %s\n", optopt, optarg);
                   break;
              case 'c':
                   printf("option = c, optopt = %c, optarg = %s\n", optopt, optarg);
                   break;
              case '?':
                    printf("option =? , optopt = %c, optarg = %s\n", optopt, optarg);
                    break;
              default:
                   printf("default, ch = %c\n",ch);
                   break;
           }
    }
 
    return 0;
}

 例2:

#include <stdio.h>
#include <unistd.h>
 
int main(int argc, char **argv)
{
    int ch;

	printf("optind:%d,opterr:%d\n",optind,opterr);
 
    while( (ch = getopt(argc, argv, "ab:c::")) != -1 )
    {
		  printf("optind: %d\n", optind);

          switch(ch)
          {
               case 'a':
                   printf("option = a, optopt = %c, optarg = %s\n", optopt, optarg);
                   break;
              case 'b':
                   printf("option = b, optopt = %c, optarg = %s\n", optopt, optarg);
                   break;
              case 'c':
                   printf("option = c, optopt = %c, optarg = %s\n", optopt, optarg);
                   break;
              case '?':
                    printf("option =? , optopt = %c, optarg = %s\n", optopt, optarg);
                    break;
              default:
                   printf("default, ch = %c\n",ch);
                   break;
           }
    }
 
    return 0;
}

 

又上面可以看出:optind和opterr的初始值都为1,opterr非零表示产生的错误要输出到stderr上。optind的初值为1是因为,main函数的那两个参数了,argc表示参数的个数,argv[]表示每个参数字符串,./test -a -b hello -cwlord,实际上真正的参数是用第二个-a 开始,也就是argv[1],所以optind的初始值为1;

2 getopt_long()

头文件:#include<getopt.h>

函数原型:int getopt_long(int argc, char * const argv[],const char *optstring, const struct option *longopts,int *longindex)

参数:optstring - 选项字符串

           longopts - 是一个结构的实例

struct option 
{
  const char *name;  /*name表示的是长参数名*/
  int has_arg;       /*has_arg有3个值:
                       1、no_argument(或者是0),表示该参数后面不跟参数值;
                       2、required_argument(或者是1),表示该参数后面一定要跟个参数值
                       3、optional_argument(或者是2),表示该参数后面可以跟,也可以不跟参数值
                     */
  int *flag;         /*用来决定,getopt_long()的返回值到底是什么。如果flag是null,则函数会返回与                            
                       该项option匹配的val值*/
  int val;           /*和flag联合决定返回值*/
}

     longindex - 如果longindex非空,它指向的变量将记录当前找到参数符合longopts里的第几个元素的描述,即是longopts的下标值

#include <stdio.h>
#include <unistd.h>
#include<getopt.h>

static struct option long_options[] =

{

        {"add", no_argument, NULL, 'a'},

        {"back", required_argument, NULL, 'b'},

        {"create", required_argument, NULL, 'c'},

        {0, 0, 0, 0},

};
 
int main(int argc, char **argv)
{
    int ch;
	int option_index = 0;
	printf("optind:%d,opterr:%d\n",optind,opterr);
 
    while( (ch = getopt_long(argc, argv, "ab:c::",long_options, &option_index)) != -1 )
    {
		printf("optind: %d\n", optind);

		switch(ch)
		{
			case 'a':
			   printf("option = a, optopt = %c, optarg = %s\n", optopt, optarg);
			   break;
			case 'b':
			   printf("option = b, optopt = %c, optarg = %s\n", optopt, optarg);
			   break;
			case 'c':
			   printf("option = c, optopt = %c, optarg = %s\n", optopt, optarg);
			   break;
			case '?':
				printf("option =? , optopt = %c, optarg = %s\n", optopt, optarg);
				break;
			default:
			   printf("default, ch = %c\n",ch);
			   break;
		}

		printf ("option %s\n", long_options[option_index].name);
    }
 
    return 0;
}

3 dlopen()

dlopen() 功能是以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym()的调用进程。使用dlclose()来卸载打开的库。

dlopen这个函数加载由以null结尾的字符串文件名命名的动态共享对象(共享库)文件,并为加载的对象返回不透明的“句柄”。此句柄与 dlopen API 中的其他函数一起使用,例如dlsym(),dladdr(),dlinfo()和dlclose()

#include <dlfcn.h>

void *dlopen(const char *filename, int flags);

void *dlsym(void *handle, const char *symbol);

int dlclose(void *handle);

char *dlerror(void);

参数:

  1. filename:库路径;
  2. flags:标志指明是否立刻计算库的依赖性
    1. RTLD_LAZY:立刻计算库的依赖性;
    2. RTLD_NOW:在需要的时候才计算库的依赖性;
  3. handle:由dlopen打开动态链接库后返回的指针;
  4. symbol:是要求获取的函数的名称,函数返回值是void*,指向函数的地址,供调用使用

注意:编译时候要加入 -ldl (指定dl库) -rdynamic(通知链接器将所有符号添加到动态符号表中(目的是能够通过使用 dlopen 来实现向后跟踪)

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

#define LIB_PATH "./libsd.so"

typedef int (*Callback_func)(int, int);

int main()
{
    void *dlhandler;
    char *error;
    Callback_func func = NULL;

    dlhandler = dlopen(LIB_PATH, RTLD_LAZY);
    if(dlhandler == NULL)
	{
        fprintf(stderr,"%s\n",dlerror());
        exit(-1);
    }

    dlerror();

    func = dlsym(dlhandler,"sumab");

    printf("%d\n",func(1,2));

    dlclose(dlhandler);

    return 0;
}

4 分区信息和文件属性

4.1  fstatfs/statfs

 #include <sys/vfs.h>    /* or <sys/statfs.h> */

 int statfs(const char *path, struct statfs *buf);
 int fstatfs(int fd, struct statfs *buf);

参数:  

  1. path: 位于需要查询信息的文件系统的文件路径名。    
  2. fd: 位于需要查询信息的文件系统的文件描述词。
  3. buf:以下结构体的指针变量,用于储存文件系统相关的信息
struct statfs {
	long    f_type;     /* 文件系统类型  */
	long    f_bsize;    /* 经过优化的传输块大小,剩余空间大小k  */
	long    f_blocks;   /* 文件系统数据块总数 */
	long    f_bfree;    /* 可用块数 */
	long    f_bavail;   /* 非超级用户可获取的块数 */
	long    f_files;    /* 文件结点总数 */
	long    f_ffree;    /* 可用文件结点数 */
	fsid_t  f_fsid;     /* 文件系统标识 */
	long    f_namelen;  /* 文件名的最大长度 */
};

返回说明:  

  • 成功执行时,返回0。失败返回-1.
#include <stdio.h>
#include <sys/vfs.h>

int main()
{
	long totalBlocks = 0;
	long freeDisk = 0;
	const char *path = "/root/work/demo";
	struct statfs diskinfo;
    int ret = statfs(path, &diskinfo);
	if(ret != 0)
	{
		printf("statfs error");
	}

	totalBlocks = diskinfo.f_bsize;
    freeDisk = diskinfo.f_bfree * totalBlocks; //剩余空间大小

	printf("totalBlocks = %ld, freeDisk = %ld\n",totalBlocks, freeDisk);

    return 0;
}

4.2 statvfs/fstatvfs 

#include <sys/statvfs.h>

int statvfs(const char *path, struct statvfs *buf);

int fstatvfs(int fd, struct statvfs *buf); 

参数:  

  1. path: 位于需要查询信息的文件系统的文件路径名。    
  2. fd: 位于需要查询信息的文件系统的文件描述词。
  3. buf:以下结构体的指针变量,用于储存文件系统相关的信息
  struct statvfs {
  unsigned long  f_bsize;    /*文件系统块大小*/
  unsigned long  f_frsize;   /*碎片大小*/
  fsblkcnt_t     f_blocks;   /*fs的大小(以f_frsize为单位)*/
  fsblkcnt_t     f_bfree;    /*可用块数*/
  fsblkcnt_t     f_bavail;   /*非根的可用块数*/
  fsfilcnt_t     f_files;    /*#索引节点*/
  fsfilcnt_t     f_ffree;    /*#空闲索引节点*/
  fsfilcnt_t     f_favail;   /*非根目录的空闲索引节点数*/
  unsigned long  f_fsid;     /*文件系统ID*/
  unsigned long  f_flag;     /*装载标志*/
  unsigned long  f_namemax;  /*最大文件名长度*/
};
  • 总容量 = f_bsize * f_blocks;
  • 剩余空间 = f_bfree * f_frsize;
  • 可用空间 = f_bavail * f_bsize

#include <stdio.h>
#include <sys/statvfs.h>

int main()
{
	long totalBlocks = 0;
	long freeDisk = 0;
	struct statvfs diskinfo;
    int ret = statvfs("./", &diskinfo);
	if(ret != 0)
	{
		printf("statfs error");
	}

	long AllTotalSize = diskinfo.f_bsize*diskinfo.f_blocks;    /*总容量*/
    long freeSize = diskinfo.f_bfree * diskinfo.f_frsize;      /*剩余空间大小*/
    long usrFreeSize = diskinfo.f_bavail * diskinfo.f_bsize;   /*可用剩余空间大小*/

	printf("AllTotalSize = %ld\n", AllTotalSize);
    printf("freeSize = %ld\n", freeSize);
    printf("usrFreeSize = %ld\n", usrFreeSize);

    return 0;
}

4.3 stat/fstat

#include <unistd.h>

#include <sys/stat.h>

int stat(const char *file_name, struct stat *buf);

int fstat(int fd, struct stat *buf); 

函数说明:将参数file_name所指的文件状态,复制到参数buf所指的结构中;

struct stat  
{   
    dev_t       st_dev;     /* ID of device containing file -文件所在设备的ID*/  
    ino_t       st_ino;     /* inode number -inode节点号*/    
    mode_t      st_mode;    /* protection -保护模式?*/    
    nlink_t     st_nlink;   /* number of hard links -链向此文件的连接数(硬连接)*/    
    uid_t       st_uid;     /* user ID of owner -user id*/    
    gid_t       st_gid;     /* group ID of owner - group id*/    
    dev_t       st_rdev;    /* device ID (if special file) -设备号,针对设备文件*/    
    off_t       st_size;    /* total size, in bytes -文件大小,字节为单位*/    
    blksize_t   st_blksize; /* blocksize for filesystem I/O -系统块的大小*/    
    blkcnt_t    st_blocks;  /* number of blocks allocated -文件所占块数*/    
    time_t      st_atime;   /* time of last access -最近存取时间*/    
    time_t      st_mtime;   /* time of last modification -最近修改时间*/    
    time_t      st_ctime;   /* time of last status change - */    
};  
#include <stdio.h>
#include <sys/types.h>    
#include <sys/stat.h>
#include <time.h>    
    
int main()  
{  
    struct stat buf;    
    int result;    
    result = stat ("./demo", &buf);    
    if (result != 0)  
	{  
		perror ("Failed to stat");  
	}  
    else  
	{    
		/* 文件的大小,字节为单位 */  
		printf("file size : %ld\n", buf.st_size);   
		/* 文件创建的时间 */   
		printf("time of creation of the file : %s\n",ctime (&buf.st_ctime));  
		/* 最近一次修改的时间 */      
		printf("time of last modification of the file: %s\n",ctime (&buf.st_mtime));   
		/* 最近一次访问的时间 */  
		printf("time of last access of the file : %s\n",ctime (&buf.st_atime)); 
	}    
    return 0;    
}  

文件/目录相关

5.1 access

#include <unistd.h>
int access(const char *pathname, int mode);

参数:

  1. pathname:文件路径
  2. mode:访问判断模式
    1. R_OK 只判断是否有读权限
    2. W_OK 只判断是否有写权限
    3. X_OK 判断是否有执行权限
    4. F_OK 只判断是否存在

返回值:0 - 成功

#include <stdio.h>
#include <unistd.h>
    
int main()  
{  
	const char *path = "./test";
    int ret = access(path, X_OK | W_OK);
	if(ret != 0)
	{
		printf("ret[ %d ]\n",ret);
	}
	else
	{
		printf("access succes!\n");
	}

    return 0;    
}  

 5.2 chdir()/opendir()/readdir()

 #include <sys/types.h>
 #include <dirent.h>

DIR *opendir(const char *name);

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

struct dirent
{
   long d_ino; 				 /* inode number 索引节点号 */
   off_t d_off; 			 /* offset to this dirent 在目录文件中的偏移 */
   unsigned short d_reclen;  /* length of this d_name 文件名长 */
   unsigned char d_type; 	 /* the type of d_name 文件类型 */
   char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
}
#include <stdio.h>
#include <dirent.h>
#include <strings.h>
 
int main()
{
	DIR *dirp = opendir(".");
	struct dirent *file;
 
	while (file = readdir(dirp)) //遍历目录下的文件
	{
		/** 过滤掉文件 */
		if ((0 == strncasecmp(file->d_name, ".", 1)))
		{
			continue;
		}
		printf("filename: %s\n", file->d_name); //文件名
	}
	closedir(dirp);
 
	return 0;
}

#include <unistd.h>

int chdir(const char *path);

功能:用户将当前的工作目录改变成以参数路径所指的目录

返回值:0 - 成功

#include <stdio.h>
#include <unistd.h>
 
int main()
{
	int ret = chdir("/root/work");
	if(ret != 0)
	{
		printf("ret[ %d ]\n", ret); //文件名
	}

	return 0;
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux常用库函数 的相关文章

  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我
  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • Gtk-ERROR **:检测到 GTK+ 2.x 符号

    我正在使用 gcc 编译我的 c 应用程序 并使用以下标志 gcc evis c pkg config cflags libs gtk 2 0 libs clutter gtk 1 0 libs gthread 2 0 Wall o evi
  • 我不明白 execlp() 在 Linux 中如何工作

    过去两天我一直在试图理解execlp 系统调用 但我还在这里 让我直奔主题 The man pageexeclp 将系统调用声明为int execlp const char file const char arg 与描述 execl exe
  • 如何在基于 Linux 的系统上的 C 程序中使用 mqueue?

    如何在基于 Linux 的系统上的 C 程序中使用 mqueue 消息队列 我正在寻找一些好的代码示例 可以展示如何以正确且正确的方式完成此操作 也许是一个操作指南 下面是一个服务器的简单示例 该服务器接收来自客户端的消息 直到收到告诉其停
  • 在两次之间每分钟执行一次 Cronjob

    我需要在 crontab 中每分钟运行一个 bash 脚本8 45am and 9 50am每天的 Code 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 8 home pull sh gt ho
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文

随机推荐

  • 记下对方的证据,抹掉自己的证据

    记下对方的证据 抹掉自己的证据 http blog vsharing com itdays A908824 html 原创 记下对方的证据 抹掉自己的证据 公司另一个部门让我告诉他们 我们的国外那家技术服务商的服务怎么样 正好被那家公司给折
  • 【有奖下载】IMG DXT GPU 让光线追踪触手可及

    继 IMG CXT GPU 之后 2023 年 1 月 Imagination 正式推出 IMG DXT GPU 这款开创性的光追 GPU 将为所有移动设备用户带来最先进的图形技术 从高端设备到主流设备 D 系列的首款产品 IMG DXT
  • this is biaoti

    富文本咯咯咯咯咯咯 早上好吃了吗
  • LVS/NAT双主 + keepalived负载均衡实现

    一 keepalived简介 keepalived是分布式部署解决系统高可用的软件 结合lvs LinuxVirtual Server 使用 解决单机宕机的问题 keepalived是一个基于VRRP协议来实现IPVS的高可用的解决方案 对
  • properties文件中用注释的方法

    很简单 用
  • DPDK-流分类与多队列

    1 前言 多队列与流分类技术基本被应用到所有DPDK网关类项目中 比如开源的DPVS 美团的四层网关等等 利用多队列及分流技术可以使得网卡更好地与多核处理器 多任务系统配合 从而达到更高效IO处理的目的 这章节以英特尔的网卡为例 介绍多队列
  • 百度翻译破解

    破解百度翻译 1 页面基本信息 打开对应页面 直接搜索 百度翻译 打开百度翻译如图 需求 获取某个单词或句子的翻译结果 键入要翻译的关键字后 页面局部刷新 依旧使用的是AJAX 2 数据抓包 进入XHP页面获取Ajax实际请求地址及相关参数
  • Sqli-labs靶场详细攻略Less 34-37

    Less 34 37 Less 34 POST Bypass AddSlashes 这一关还是进行宽字节注入 与上一关的区别在于使用了post方法进行传递 先试一下上一关的注入代码 因为这一关是登录 就使用之前的dumb账号 dumb df
  • onenote标注pdf笔记_使用OneNote做文献阅读笔记的正确打开方式

    又到了紧张赶毕业论文的时候了 写毕业论文的时候 文献阅读是一个必不可少的环节 但是 当需要阅读的文献越来越多 需要记录的阅读笔记也越来越多时 问题来了 有没有自动保存笔记的方法 文献阅读的笔记太多 如何快速找到想要的文献笔记 有没有方法可以
  • QGIS:生成网格的步骤

    第一步 打开工具箱中的 创建网格 第二步 按照自己的需求设置参数 特别说明 1 网格类型要选 矩形 默认是点 2 网格范围可以自己定义范围 右边倒三角点开第三个 3 间隔设置不能超过网格范围 单位跟选择的坐标参考系相关联 mercator坐
  • 贝叶斯优化 Bayesian Optimization

    贝叶斯优化算法 BOA 贝叶斯优化算法BOA 背景介绍 贝叶斯优化流程 形式化 算法流程 核心算法 Prior Function Acquisition Function 参考文献 背景介绍 当前的场景中 会面临很多设计选择问题 比如说在工
  • Uncaught DOMException: Failed to execute 'removeChild' on 'Node': The node ……

    解决办法是加一个等待时间即可解决问题 setTimeout function you code 5
  • 在一台电脑上用不同端口同步以太坊区块链节点

    首先要获取第一个节点的信息 在第一个节点的控制台中输入 gt admin nodeInfo enode 将输出的结果用鼠标操作复制 然后在第二个节点的JS控制台中添加第一个节点为静态节点 输入 gt admin addPeer 例如admi
  • AdminLTE3框架下的BootStrap Modal 模态框

    直接贴出栗子 里面有注解
  • 主机与VMware的Linux虚拟机之间共享交换文件

    搭建环境 主机系统 Windows7 Ultimate VM软件 VMware Workstation 7 1 3 虚拟机系统 Linux Ubuntu 10 10 操作步骤 1 在主机上新建一个共享路径 用于将来和虚拟机之间进行共享文件
  • 几种常见模式识别算法整理和总结

    这学期选了门模式识别的课 发现最常见的一种情况就是 书上写的老师ppt上写的都看不懂 然后绕了一大圈去自己查资料理解 回头看看发现 Ah ha 原来本质的原理那么简单 自己一开始只不过被那些看似formidable的细节吓到了 所以在这里把
  • springboot使用SSE

    1 pom文件
  • 传递空指针,在函数中开辟内存并返回

    include
  • android 退出程序关闭死循环线程的一种方法(开源中国客户端下载APK疑问总结)...

    为什么80 的码农都做不了架构师 gt gt gt 在android中往往退出程序时会调用以下方法 那么这个方法一定有效吗 在什么情况下没有用呢 1 关闭掉所有界面 2干掉当前进程 android os Process killProces
  • Linux常用库函数

    目录 1 getopt 2 getopt long 3 dlopen 4 分区信息和文件属性 4 1 fstatfs statfs 4 2 statvfs fstatvfs 4 3 stat fstat 1 getopt getopt被用来