小编che*_*989的帖子

linux是否允许从信号处理程序进行任何系统调用?

我的理解是,一般来说,如果从信号处理程序调用非异步信号安全函数,行为是不确定的,但我听说linux允许你安全地调用任何系统调用.这是真的?此外,SIGSEGV处理程序的唯一可移植行为是中止或退出,但我知道如果你返回,linux实际上会恢复执行,是吗?

c linux signals

18
推荐指数
3
解决办法
8060
查看次数

add_custom_command未生成目标

也许这是不可能的,我误读了cmake 3.2文档,但我创建一个自定义命令会在Makefile中创建一个自定义"目标",这样我就可以通过调用输出文件的名称来构建目标.CMake文档说:

在makefile术语中,这将以下列形式创建一个新目标:

 OUTPUT: MAIN_DEPENDENCY DEPENDS
    COMMAND
Run Code Online (Sandbox Code Playgroud)

所以我想我可以跑了make OUTPUT.也许文档将CMake目标与Makefile目标混淆了?

例如,

 add_custom_command(OUTPUT foo_out
    COMMAND post_process foo_in > foo_out
    DEPENDS foo_in
 )
Run Code Online (Sandbox Code Playgroud)

我想要做

 make foo_out
Run Code Online (Sandbox Code Playgroud)

它会使foo_out.但是,如果我这样做,我明白了

make: **** No rule to make target `foo_out`. Stop.
Run Code Online (Sandbox Code Playgroud)

果然,cmake二进制输出目录中的任何文件中都不存在"foo_out"这个词.如果我把它改成这个

add_custom_target(bar DEPENDS foo_out)
add_custom_command(OUTPUT foo_out COMMAND post_process foo_in > foo_out)
Run Code Online (Sandbox Code Playgroud)

然后我就能做到

make bar
Run Code Online (Sandbox Code Playgroud)

我能做到

make foo_in
Run Code Online (Sandbox Code Playgroud)

但我还是做不到

make foo_out
Run Code Online (Sandbox Code Playgroud)

问题make bar是它不直观,因为实际的文件输出foo_out不是bar.

我该怎么做呢?

在我的例子中,我需要对标准可执行目标运行一个特殊的处理步骤,该目标将可选资源插入到ELF文件中.我希望能够将两个可执行文件作为Makefile目标,因此我可以构建裸ELF可执行文件以及注入资源的ELF可执行文件.

如果我正在编写自定义Makefile,这很简单!

foo_in: foo.c
    $(CC) $< -o $@

foo_out: foo_in
    post_process $< …
Run Code Online (Sandbox Code Playgroud)

cmake add-custom-command

18
推荐指数
2
解决办法
2万
查看次数

如何在Android中将设备连接到WiFi时获取蜂窝网络的IP地址

有没有办法我可以同时获取Android中的WiFi和蜂窝网络的IP地址.我尝试使用很多例子,但能够获得只有WiFi网络而不是蜂窝网络的地址.我已启用WiFi和蜂窝网络设备可通过WiFi访问Internet.

这是我用来获取IP地址的代码:

    String ipAddress = null;
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    ipAddress = inetAddress.getHostAddress().toString();
                    Log.i("Here is the Address",ipAddress);
                }
            }
        }
    } catch (SocketException ex) {

    }
Run Code Online (Sandbox Code Playgroud)

当设备连接到WiFi时,是否有可能获得蜂窝网络的IP地址.如果是,那么这是可行的.

networking android ip-address

18
推荐指数
2
解决办法
1万
查看次数

如何使用C++找到最长公共子串

我在网上搜索了一个C++ Longest Common Substring实现,但未能找到一个像样的.我需要一个返回子串本身的LCS算法,因此它不仅仅是LCS.

不过,我想知道如何在多个字符串之间做到这一点.

我的想法是检查两个字符串之间的最长字符串,然后检查所有其他字符串,但这是一个非常缓慢的过程,需要在内存上管理许多长字符串,使我的程序非常慢.

知道如何为多个字符串加速这个吗?谢谢.

重要编辑 我给出的一个变量确定了最长公共子串需要的字符串数,因此我可以给出10个字符串,并找到它们的LCS(K = 10)或LCS为4他们,但我不知道哪个4,我必须找到最好的4.

c++ algorithm lcs

17
推荐指数
2
解决办法
4万
查看次数

C:什么是缓冲区下溢的例子?

我知道缓冲区溢出是什么.我不知道缓冲区下溢是什么.

我猜它是一个特定的缓冲区接收而不是字节溢出,字节下溢.

char buffer[8];
fgets(buffer, sizeof(buffer), stdin);
Run Code Online (Sandbox Code Playgroud)

以上将不会出错.

char buffer_overflow[8];
fgets(buffer_overflow, 16, stdin);
Run Code Online (Sandbox Code Playgroud)

如果用户输入是例如"deutschland",则上述将导致缓冲区溢出.

我可以在代码中获得一个示例,缓冲区下溢是什么?

c underflow

16
推荐指数
2
解决办法
1万
查看次数

如何删除C++ std :: string中的重音和波形符号

我在C++中有一个字符串的问题,它有几个西班牙语单词.这意味着我有很多带有重音符号和波浪号的单词.我想替换他们没有重音的同行.示例:我想替换这个词:哈比亚的"había".我尝试直接替换它,但使用字符串类的替换方法,但我无法让它工作.

我正在使用此代码:

for (it= dictionary.begin(); it != dictionary.end(); it++)
{
    strMine=(it->first);
    found=toReplace.find_first_of(strMine);
    while (found!=std::string::npos)
    {
        strAux=(it->second);
        toReplace.erase(found,strMine.length());
        toReplace.insert(found,strAux);
        found=toReplace.find_first_of(strMine,found+1);
    }
}
Run Code Online (Sandbox Code Playgroud)

dictionary这样的地图在哪里(有更多条目):

dictionary.insert ( std::pair<std::string,std::string>("á","a") );
dictionary.insert ( std::pair<std::string,std::string>("é","e") );
dictionary.insert ( std::pair<std::string,std::string>("í","i") );
dictionary.insert ( std::pair<std::string,std::string>("ó","o") );
dictionary.insert ( std::pair<std::string,std::string>("ú","u") );
dictionary.insert ( std::pair<std::string,std::string>("ñ","n") );
Run Code Online (Sandbox Code Playgroud)

toReplace字符串是:

std::string toReplace="á-é-í-ó-ú-ñ-á-é-í-ó-ú-ñ";
Run Code Online (Sandbox Code Playgroud)

我显然必须遗漏一些东西.我无法弄清楚.有没有我可以使用的图书馆?

谢谢,

c++ string text str-replace

15
推荐指数
2
解决办法
2万
查看次数

与我的abs()相比,C++ math.h abs()有什么不同

我目前正在用C++编写一些类似矢量数学类的glsl,我刚刚实现了abs()这样的函数:

template<class T>
static inline T abs(T _a)
{
    return _a < 0 ? -_a : _a;
}
Run Code Online (Sandbox Code Playgroud)

我将它的速度与默认的C++进行了比较abs,math.h如下所示:

clock_t begin = clock();
for(int i=0; i<10000000; ++i)
{
    float a = abs(-1.25);
};

clock_t end = clock();
unsigned long time1 = (unsigned long)((float)(end-begin) / ((float)CLOCKS_PER_SEC/1000.0));

begin = clock();
for(int i=0; i<10000000; ++i)
{
    float a  = myMath::abs(-1.25);
};
end = clock();
unsigned long time2 = (unsigned long)((float)(end-begin) / ((float)CLOCKS_PER_SEC/1000.0));

std::cout<<time1<<std::endl;
std::cout<<time2<<std::endl;
Run Code Online (Sandbox Code Playgroud)

现在默认的abs需要大约25ms而我的需要60.我猜有一些低级优化正在进行中.有人知道math.h abs …

c++ math performance function absolute-value

15
推荐指数
4
解决办法
2万
查看次数

在C++中格式化输出

在C++代码中,我有一个双打变量矩阵,我打印出来.但是因为它们都具有不同的位数,所以输出格式被破坏.一种解决方案是做 cout.precision(5)但我希望不同的列具有不同的精度.此外,由于在某些情况下存在负值,因此-符号的存在也会引起问题.如何解决这个问题并生成格式正确的输出?

c++ output-formatting

15
推荐指数
3
解决办法
5万
查看次数

在C++中,用另一个字符串替换字符串中所有出现的子字符串的最快方法是什么?

我正在寻找最有效(以"最快"的方式)用另一个字符串替换字符串中所有出现的子字符串的方法.到目前为止,我想出的就是:

std::string StringReplaceAll(const std::string &cstSearch, const std::string &cstReplace, const std::string &cstSubject)
{
    if(cstSearch.length() > cstSubject.length() || cstSearch == cstReplace || cstSubject.empty() || cstSearch.empty() || cstSubject.find(cstSearch) == std::string::npos)
    {
        return cstSubject;
    }

    std::ostringstream                                  ossReturn;
    std::string::const_iterator                         ci(cstSubject.cbegin());
    const std::string::const_iterator::difference_type  ciFindSize(std::distance(cstSearch.cbegin(), cstSearch.cend()));

    for(std::string::const_iterator ciNow; (ciNow = std::search(ci, cstSubject.cend(), cstSearch.cbegin(), cstSearch.cend())) != cstSubject.cend(); ci = ciNow)
    {
        std::copy(ci, ciNow, std::ostreambuf_iterator<char> (ossReturn));
        std::copy(cstReplace.cbegin(), cstReplace.cend(), std::ostreambuf_iterator<char> (ossReturn));
        std::advance(ciNow, ciFindSize);
    }

    std::copy(ci, cstSubject.cend(), std::ostreambuf_iterator<char> (ossReturn));

    return ossReturn.str();
}
Run Code Online (Sandbox Code Playgroud)

...这个方式(!!!)对我的需求来说太慢了:-(

期待向你们学习!

c++ string performance stl str-replace

14
推荐指数
1
解决办法
6524
查看次数

使用write或async-safe函数从信号处理程序中打印int

我想write在信号处理程序内使用(或任何异步安全函数)将数字打印到日志或终端中.我宁愿不使用缓冲I/O.

是否有一种简单而推荐的方法可以做到这一点?

例如代替printf,我更喜欢write(或任何asyn安全功能).

void signal_handler(int sig)
{
  pid_t pid;
  int stat;
  int old_errno = errno;

  while((pid = waitpid(-1, &stat, WNOHANG)) > 0)
    printf("child %d terminated\n", pid);

  errno = old_errno;
  return;
}
Run Code Online (Sandbox Code Playgroud)

打印字符串很容易.代替printf上面我可以使用(不打印pid):

write(STDOUT_FILENO, "child terminated", 16);
Run Code Online (Sandbox Code Playgroud)

c signals async-safe

14
推荐指数
1
解决办法
7671
查看次数