最近遇到一些开发部署等方面的几个小问题,留个笔记。

第一个 编程问题

#include 
#include 
#include 

int main(int argc, char *argv[])
{
	int ret;

	pthread_mutex_t mt;
	ret = pthread_mutex_init(&mt, NULL);
	if (ret != 0) {
		printf("failed to init (ret: %d)\n", ret);
		goto fail;
	}
	ret = pthread_mutex_unlock(&mt);
	if (ret != 0) {
		printf("failed to unlock (ret: %d)\n", ret);
		goto fail;
	}
	ret = pthread_mutex_destroy(&mt);
	if (ret != 0) {
		printf("failed to destroy (ret: %d)\n", ret);
		goto fail;
	}

	printf("complete\n");
	return 0;
fail:
	printf("fail\n");
	return -1;
}
#编译
gcc test.c -o test -lpthread
#运行
./test
#结果
failed to destroy (ret: 16)
fail

pthread_mutex_destroy返回了EBUSY(16)错误,看来pthread的限制还挺严格的,只做了unlock的mutex不能正常destroy, 为什么?最后找到了 这个链接 看这意思,maintainer死活不肯改,觉得这个行为是正确的。既然maintainer不肯,那我也只好在程序里用pthread_cond代替了mutex,免得pthread_mutex_destroy老报错。

第二个 编程问题

#include 
#include 

int main(int argc, char **argv[])
{
	char test[ARG_MAX];
	memset(test, 0, ARG_MAX);
}

这段代码编译正常。但是如果我们在第一行再加一个"#include ",在debian下还能正常编译,但在centos6上编译就报错:

/root/a.c: In function ‘main’:
/root/a.c:7: error: ‘ARG_MAX’ undeclared (first use in this function)
/root/a.c:7: error: (Each undeclared identifier is reported only once
/root/a.c:7: error: for each function it appears in.)

原因是/usr/include/bits/local_lim.h里有一堆宏定义,最后把ARG_MAX又给undef了,颇为诡异。难道在centos6上就不应该limits.h和linux/limits.h一起用?实际代码如果多了,难免两个头文件都要include的。这里 给了一个标准的解决办法,就是用sysconf(_SC_ARG_MAX)代替ARG_MAX。

第三个 ssh通道打通

ssh通道打通是常见操作,但是我在机器上发现虽然按照步骤打通了,但是本机ssh还是需要密码,最后coly帮忙找到了原因:selinux。还要在/etc/selinux/config中将selinux设置成disabled,然后 setenforce 0,ssh通道才真“通”了。
感谢coly的发现,我不用继续输密码了。