小编TPJ*_*TPJ的帖子

在 rsync 中使用文件锁


从 rsync 手册文档我看到,通过使用选项 rsync-path,可以指定要在远程机器上运行的程序来启动 rsync。特别是,该程序可以是一个包装脚本,它在中间调用实际的 rsync 命令,但在 rsync 调用之前和/或之后执行一些操作。一个可能有趣的用途是获取/释放锁(例如,flock),以便远程端的 rsync 操作可以与远端的另一个进程协调,该进程争用对同一进程的写访问文件。可能有多个 rsync 进程同时持有共享锁(我知道可能会出现饥饿,但现在并不担心)。我正在处理的“作家”过程只会改变一些硬链接,

我看过其他协调方法,例如,在客户端和服务器之间实现自定义远程锁定协议,但它们都涉及更多的开发工作和/或由于其他原因不令人满意,这就是为什么我对包装器/ (f) 锁定方法。

我的问题是:

1)这是解决协调rsync“读者”与另一个访问同一目录的“作者”进程的问题的合理方法吗?

2)在使用 inetd(或 xinetd)守护进程方法运行 rsync 时,您是否也可以通过在 /etc/inetd.conf 中添加类似以下内容的行(根据 rsyncd.conf 手册页)来围绕 rsync 放置一个包装器:

rsync 流 tcp nowait root /usr/bin/rsync rsyncd --daemon

但是将 /usr/bin/rsync 替换为您的 rsync-lookalike 包装器的路径,在这种情况下,这将是一个 C/C++ 代码程序,它获取锁,分叉出 rsync,等待 rsync 完成,然后释放锁.

谢谢,汤姆

rsync

6
推荐指数
1
解决办法
6548
查看次数

函数模板推导和initlializer_list

我有以下功能模板:

template <typename K, typename V>
void f(std::initializer_list<std::pair<const K, V>> il)
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

我把这个函数调用如下:

f({std::pair<const int,int>(1,2), std::pair<const int,int>(3,4)});    //(a)
Run Code Online (Sandbox Code Playgroud)

它工作正常.

但是,如果我尝试按如下方式调用它:

f({{1,2}, {3,4}});    //(b)
Run Code Online (Sandbox Code Playgroud)

它无法推断出正确的类型,并且我得到了一个编译错误:

'no matching function for call to 'f(<brace-enclose initializer list>)
note candidate is:
note: template <class K, class V> void f(std::initializer_list<std::pair<const K, V>>)'
Run Code Online (Sandbox Code Playgroud)

如果我这样称呼如下:

f({std::pair<const int,int>(1,2), {3,4}});    //(c)
Run Code Online (Sandbox Code Playgroud)

类型推导有效,但如果我尝试按如下方式调用它:

f({std::make_pair(1,2), {3,4}});   //(d) 
Run Code Online (Sandbox Code Playgroud)

我得到与以前相同的编译错误.

我的问题是:

为什么模板类型推导在(c)中有效而在(d)中不起作用?

(编译器是gcc v4.6.3,带标志-std = c ++ 11)

我看过类似的,较旧的SO帖子,但他们似乎没有完全回答这个问题.

c++ templates initializer-list c++11 template-argument-deduction

5
推荐指数
1
解决办法
126
查看次数