存档

2016年10月 的存档

ubuntu mysql5.7无法远程连接问题

2016年10月31日 没有评论

晚上在做联系xtrabackup时,实验环境是一台centos7和一台ubuntu 16.04的虚拟机,centos7上面安装的mysql在创建完远程连接账号以后可以正常登陆,但是ubuntu却无法登录,提示“ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.168.99.88’ (61)”。其实问题很简单,这里主要记录一下当时我解决问题的思路,当然当时思路不是很正确,以前也没有遇到过类似的问题。

第一时间我想到的是自己是不是把账号弄错了,ubuntu上面的mysql没有对应的账号(带上本机3台mysql难免会弄错),就用一个root账号在ubuntu上本地登录,然后查看当前的系统有哪些用户,发现自己登录用的远程账号和权限没有问题。


mysql -uroot -p

use mysql;

select * from user\G;

然后就是防火墙,是不是防火墙没有开启。那么就查看ubuntu的防火墙。


sudo iptables -L #查看防火墙规则列表

sudo iptables -F  #清空防火墙列表

做完这些还是无法登录,google了一下,发现是ubuntu系统下mysql的bind问题。ubuntu中mysql默认绑定的是127.0.0.1,这样就只允许本机登录,想要允许其他地方登录只需要把bind改成公网ip或者任何ip均可。

编辑mysql的配置文件”/etc/mysql/mysql.conf.d/mysqld.cnf”


#bind-address = 127.0.0.1
bind-address = 0.0.0.0

然后重启mysql,问题就解决了!

c语言函数指针

2016年10月18日 没有评论

最近在学习nginx相关的内容,看书上介绍nginx的源码,里面很多地方都用到了函数指针。对于我这种c语言菜鸟来说,看的是云里雾里的,搞不清楚要干嘛,就搜索了一些函数指针的内容,自己动手实验了一番。

在C系列语言中,任何一个变量,总是要先声明,之后才能使用的,这和php差别还是很大的。函数指针的声明可以按照如下”返回类型 (*变量名)(函数参数…)“进行,下面我来举几个例子。


void (*my_func1)(void);  //声明一个返回类型为空,参数为空,名字为my_func1的函数指针

int (*my_func2)(int x,int y);  //声明一个返回类型为整形,参数为整形x和整形y,名字为my_func2的函数指针

int (*my_func3)(int,int);   //声明一个返回类型为整形,参数为2个整形,名字为my_func3的函数指针,其实和上面的my_func2一样

void (*my_func4)(char *str);  //声明一个返回类型为空,参数为字符指针,名字为my_func4的函数指针

typedef void (*void_func_t)(void);  //typedef关键字是类型定义,这里就是定义了一个返回值为空,参数为空的函数指针类型,类型名称为void_func_t

相信经过上面的例子,对c语言的函数指针大家都有一个初步的概念,看了下面的代码相信大家基本都能初步掌握函数指针了.

文件名:main.c


#include <stdio.h>

//定义返回值为int,传入参数为2个int的函数指针
int (*point_func)(int,int);
int (*p_func)(int a,int b);
//定义返回值为int,传入参数为2个int的函数指针类型
typedef int (*sum_func)(int,int);

/**
 * 定义一个相加函数
 */
int sum(int x,int y){
 int r = x+y;
 printf("%d+%d=%d\n",x,y,r);
 return r;
}
//执行传入进去的函数
void exec_func(sum_func do_func){
 do_func(10,21);
}

int main() {
 int result;
 sum_func my_func;

my_func = sum;
 result = sum(1,2);
 point_func = &sum;
 p_func=point_func;
 //通过指针的方式调用函数
 (*point_func)(3,4);
 (*p_func)(5,6);
 p_func(7,8);
 exec_func(my_func);
 exec_func(point_func);
 return 0;
}


上面代码中我们既可以通过”(*p_func)(5,6)”也可以直接通过”p_func(7,8)”直接调用,前者是比较正规的写法,但是阅读起来是不是没有后者那么舒服顺畅。

编译上面代码”gcc main.c -o main”,执行代码就可以看到下面的输出结果:


1+2=3
3+4=7
5+6=11
7+8=15
10+21=31
10+21=31