前言 这几天做课设,Linux下的Huffman编码译码器,在命令行输入文件时希望能够实现自动补全,避免错误的同时使输入更加的便捷,于是便想到了暑假时的readline()函数,readline()函数确实很赞,可以与当前的Bash命令行进行交互 Readline库的安装 在Ubuntu下命令行安装 sudo apt-get install libreadline6-dev 这样Readline库就安装完成 Readline库的动态链接 然后进行一下小测试 #include<iostream> #include<readline/readline.h> using namespace std; int main() { char a[] = "please input a string\n"; char *input = readline(a); printf("%s\n",input); return 0; } 后来才知道Readline是一个动态链接库,对动态库链接需要找到它的位置 继续阅读 >>


殷健翔 18/01/02 14:05:06
#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<pthread.h> #define COUNT 10 static int i = 1; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t even = PTHREAD_COND_INITIALIZER; pthread_cond_t uneven = PTHREAD_COND_INITIALIZER; //1 3 5 7 9 void* funA(void *arg) { while(i <= COUNT) { pthread_mutex_lock(&mutex); if(i % 2 != 0) { printf("funA : %d\n",i); ++i; 继续阅读 >>


李佳灏 17/12/10 19:06:37
1. 什么是守护进程 守护进程daemon,是指没有控制终端,运行在后台的进程,通常伴随着系统启动产生,系统关机结束。可以使用命令ps -axj查看系统的守护进程,输出如下所示: 父ID PID 组ID 会话ID 终端 状态 用户ID 命令 PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 1 1 1 ? -1 Ss 0 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 0 2 0 0 ? -1 S 0 0:00 [kthreadd] 2 3 0 0 ? -1 S 0 0:00 [ksoftirqd/0] 说明: 1 继续阅读 >>


杨博东 17/11/28 01:12:09
内核版本:linux-4.4.18 源码位置:这里 fork相关的代码最终执行的函数为_do_fork(),下面按照顺序分析下_do_fork(): 首先判断是否需要trace(跟踪)这个进程,这一步主要与调试相关,GDB在x86-64 Linux 系统上的原理就是利用ptrace(2)系统调用 [1]。 有关likely和Unlikely,实际上是利用gcc内置函数对分支条件的优化 [2]。 if (likely(!ptrace_event_enabled(current, trace))) // likely表示大多数情况下下面分支会被执行 trace = 0; 接着代码调用copy_process(),它设置了进程描述符以及子进程所需的任何其他内核数据结构。 它的参数和_do_fork()相比增加了一个子进程的pid。 接下来检查clone_flags参数中传递的标志是否兼容。 通过调用security_task_create()来执行额外的安全检查。 调用dup_task_struct(),为新进程创建新的内核堆栈,t 继续阅读 >>


杨博东 17/11/27 19:57:46
Linux下不支持fflush刷新缓冲区,所以我们想到了setbuf函数,这随之而来的各种问题和小伙伴探讨之后得出如下结论 首先,网上有很多不同的言论,有的说setbuf只是刷新缓冲区,有的说会关闭缓冲区,众说纷纭,经过我们的测试和查找资料,如果你将stdin/stdout指向NULL,setbuf会关闭你的缓冲区,而不仅仅是刷新(查询度娘和man手册)。 例如:setbuf(stdin,NULL); 因为stdin相当于一股输入流,你把它指向空,那么就不仅仅是刷新了,他会关闭你的输入缓冲区,而从你的输入流里读数据。而输入流是行缓冲,但也会保存你的每一个字符(例如你的回车和空格,就像你的输入缓冲区有时候在cin的错误输入下,也会保存回车,如果你的输入流不存回车,那么他从哪里拿的回车呢?关于这个问题,具体大家可以看我的上一篇博客这里写链接内容 ) 综上所述,setbuf会将缓冲区更改为你指定的内存,而当你将stdin,stdout指向NULL,他会关闭 输入/输出缓冲区,而更改为从输入/输出流里去拿数据,而这两者的区别:效率 肯定是有缓冲区更高,输入流 继续阅读 >>


吕子健 17/11/12 23:13:59
转自:http://blog.csdn.net/alada007/article/details/8105550 linux 下动态链接库的制作与使用 动态链接库*.so的编译与使用- - 动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。 1、动态库的编译 下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。 so_test.h: #include <stdio.h> #include <stdlib.h> void test_a(); void test_b(); void test_c(); test_a.c: #include "so_test.h" void test_a() { printf("thi 继续阅读 >>


殷健翔 17/11/05 12:28:23
信号安装 (1) signal() #include <signal.h> void (*signal(int signum, void (*handler))(int)))(int); 如果该函数原型不容易理解的话,可以参考下面的分解方式来理解: typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler)); 第一个参数指定信号的值,第二个参数指定针对前面信号值的处理,可以忽略该信号(参数设为SIGIGN);可以采用系统默认方式处理信号(参数设为SIG_DFL);也可以自己实现处理方式(参数指定一个函数地址)。 如果signal()调用成功,返回最后一次为安装信号signum而调用signal()时的handler值;失败则返回SIGERR。 (2)sigaction() #include <signal.h> int sigaction(int signum,const struct siga 继续阅读 >>


殷健翔 17/11/05 12:22:37
信号概念 信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式。在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据。 信号的来源 信号的来源可以有很多种,按照产生条件的不同可以分为硬件和软件两种。 1、 硬件方式 当用户在终端上按下某键时,将产生信号。如按下Ctrl + C组合键后将产生一个SIGINT信号。 硬件异常产生信号:除数据、无效的存储访问等。这些事件通常由硬件(如:CPU)检测到,并将其通知给Linux操作系统内核,然后内核生成相应的信号,并把信号发送给该事件发生时正在进行的程序。 2、 软件方式 用户在终端下调用kill命令向进程发送任务信号。 进程调用kill或sigqueue函数发送信号。 当检测到某种软件条件已经具备时发出信号,如由alarm或settimer设置的定时器超时时将生成SIGALRM信号。 信号种类 信号的种类 在Shell下输入kill –l 可显示Linux 系统支持 继续阅读 >>


殷健翔 17/11/05 11:30:17
useradd命令 useradd 选项 用户名 -d 目录,指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。 -g 用户组,指定用户所属的用户组。 -G 用户组,指定用户所属的附加组。 -s Shell文件,指定用户的登录Shell。 -u 用户号,指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。 例1: # useradd –d /home/sam -m sam 添加了一个用户sam,并且他的主目录为/home/sam,没有主目录的时候自动创建。(/home为默认的用户主目录所在的父目录) 例2: useradd -s /bin/sh -g group –G adm,root gem 添加一个用户gem,使用的Shell是/bin/sh,主用户组为group,附加组为adm,root。 userdel命令 userdel 选项 用户名 -r 把用户的主目录一起删除。 usermod命令 usermod 选项 用户名 例 继续阅读 >>


董恒毅 17/10/20 11:46:02
MySQL两个结构相同的表合并 1.把两张表的数据全部导入到临时表中 create table 临时表 select * from 表1 union select * from 表2; 2.创建结果表,并创建主键 create table 结果表(字段1 类型 primary key,字段2 类型,字段3 类型…); 3.把临时表中重复数据过滤并写入结果表 insert into 结果表(字段1,字段2,字段3…) select distinct 字段1,字段2,字段3… from 临时表; 4.删除临时表 drop table 临时表; 关于mysql数据库备份 1.导出整个数据库。 mysqldump -u用户名 -p密码 数据库名 >导出的文件名 a.密码可以在第二行以不可见的形式输入,这样最安全。 b.导出的文件需要自己建立,最好以.sql格式结尾。 2.导出一个表。 mysqldump -u用户名 -p密码 数据库名 表名>导 继续阅读 >>


殷健翔 17/10/06 16:53:20