最近遇到一些开发部署等方面的几个小问题,留个笔记。
第一个 编程问题
#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的发现,我不用继续输密码了。
由 udpwork.com 聚合
|
评论: 0
|
要! 要! 即刻! Now!