小编Tim*_*ler的帖子

Bash - 将输出重定向到文件时处理退格控制字符

我必须在后台运行第三方程序并将其输出捕获到文件中。我只是使用the_program > output.txt. 然而,该程序的编码人员决定华丽并实时显示处理后的行,使用\b字符擦除以前的值。因此,output.txt 中的其中一行最终会变成Lines: 1(b)2(b)3(b)4(b)5(b)成为带有 ASCII 代码的不可打印字符08。我希望该行最终成为Lines: 5.

我知道我可以按原样编写并使用 AWK对文件进行后处理,但我想知道是否可以通过使用某种 shell 选项或通过管道将一些命令放在一起来就地处理控制字符,这样Lines: 5程序完成后该行就无需运行任何其他命令了?

编辑:

只是澄清一下:我在这里写的是一个简化版本,程序处理的实际行数是十万,所以字符串最终很长。

linux bash shell

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

双重检查锁定 - 陷阱?

我正在使用java大约一个月,而且我一般都是编程的业余爱好者,所以如果我出错了,请随时纠正我.也许我会提供一些过多的细节,但我现在很困惑,我无法决定什么是重要的.

所以,我一直在开发多线程客户端 - 服务器应用程序.所有线程都使用相同的对象,其中存储了某些配置值和共享记录器; 此对象在服务器线程中初始化,然后作为参数传递给客户端线程类构造函数.首先,假设当服务器启动时,该对象的字段只更改一次,因此并发访问无需担心,但现在需要在修改时从配置文件中重新读取某些配置值,而不必重启服务器.

在一些研究之后想到的第一个想法是创建一个同步方法,当请求类中的某些值时将调用该方法,并且如果我们的配置文件自上次访问后发生更改则会重新读取这些值,否则会立即返回,如这个:

<This code is inside "config" class, instance of which is shared between threads>
private static long lastModified;
private static File configFile;

public class ChangingVariableSet
    {
    <changing variables go here>
    }

private synchronized void ReReadConfig
    {
    long tempLastMod = configFile.lastModified();
    if(lastModified == tempLastMod)
        return;
    <reread values here>
    lastModified = tempLastMod;
    }

public ChangingVariableSet GetValues()
    {
    ReReadConfig();
    <return necessary values>
    }
Run Code Online (Sandbox Code Playgroud)

(上面的代码没有经过测试,我只是希望得到一般的想法).

但我只是不喜欢堵的想法每一次请求的值,因为这似乎昂贵,以及我的应用程序有可能成为相当高负荷,有很多在未来线程的可能性.所以我有一个"好"的想法 - 在锁定之前检查文件是否被修改,然后再次在锁定方法内部,以避免在任何可能的情况下锁定:

 public ChangingVariableSet GetValues()
    {
    if(lastModified == configFile.lastModified())
        ReReadConfig();
    <return …
Run Code Online (Sandbox Code Playgroud)

java synchronization double-checked-locking

4
推荐指数
1
解决办法
390
查看次数