IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    小问题汇总

    RobinDong发表于 2014-02-13 04:40:21
    love 0

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

    第一个 编程问题

    #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 limits.h>
    #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的发现,我不用继续输密码了。



沪ICP备19023445号-2号
友情链接