草庐IT

c - 如何检测当前进程是否正在由 GDB 运行

标准方法如下:if(ptrace(PTRACE_TRACEME,0,NULL,0)==-1)printf("traced!\n");在这种情况下,如果当前进程被跟踪(例如,使用GDB运行它或附加到它),ptrace会返回一个错误。但是这样做有一个严重的问题:如果调用成功返回,GDB以后可能不会附加到它。这是一个问题,因为我没有尝试实现反调试的东西。我的目的是在满足条件(例如,断言失败)并且GDB正在运行(否则我得到一个停止应用程序的SIGTRAP)时发出一个“int3”。每次都禁用SIGTRAP并发出“int3”不是一个好的解决方案,因为我正在测试的应用程序可能会将SIGTRAP用于其

c - Linux共享内存: shmget() vs mmap()?

在this线程OP建议使用mmap()而不是shmget()在Linux中获取共享内存。我访问了this页和this页面来获取一些文档,但第二个给出了一个关于mmap()的晦涩示例。几乎是新手,需要在两个进程之间共享一些信息(以文本形式),我应该使用shmget()方法还是mmap()?为什么? 最佳答案 这两种方法都是可行的。mmap方法比shmget更严格一些,但更易于使用。shmget是旧的SystemV共享内存模型,支持最广泛。mmap/shm_open是新的POSIX共享内存方式,更易于使用。如果您的操作系统允许使用POS

c - Linux共享内存: shmget() vs mmap()?

在this线程OP建议使用mmap()而不是shmget()在Linux中获取共享内存。我访问了this页和this页面来获取一些文档,但第二个给出了一个关于mmap()的晦涩示例。几乎是新手,需要在两个进程之间共享一些信息(以文本形式),我应该使用shmget()方法还是mmap()?为什么? 最佳答案 这两种方法都是可行的。mmap方法比shmget更严格一些,但更易于使用。shmget是旧的SystemV共享内存模型,支持最广泛。mmap/shm_open是新的POSIX共享内存方式,更易于使用。如果您的操作系统允许使用POS

linux - 消息队列在 linux 中过时了吗?

我最近一直在使用Linux中的消息队列(SystemV,但POSIX也应该没问题),它们似乎非常适合我的应用程序,但是在阅读了TheArtofUnixProgramming我不确定它们是否真的不错的选择。http://www.faqs.org/docs/artu/ch07s02.html#id2922148Theupper,message-passinglayerofSystemVIPChaslargelyfallenoutofuse.Thelowerlayer,whichconsistsofsharedmemoryandsemaphores,stillhassignificantap

linux - 消息队列在 linux 中过时了吗?

我最近一直在使用Linux中的消息队列(SystemV,但POSIX也应该没问题),它们似乎非常适合我的应用程序,但是在阅读了TheArtofUnixProgramming我不确定它们是否真的不错的选择。http://www.faqs.org/docs/artu/ch07s02.html#id2922148Theupper,message-passinglayerofSystemVIPChaslargelyfallenoutofuse.Thelowerlayer,whichconsistsofsharedmemoryandsemaphores,stillhassignificantap

linux - 什么是 SEGV_MAPERR?

什么是SEGV_MAPERR,为什么总是想出SIGSEGV? 最佳答案 有两种常见的SEGV,这是由于内存访问无效导致的错误:访问了具有错误权限的页面。例如,它是只读的,但您的代码试图写入它。这将报告为SEGV_ACCERR.访问的页面根本没有映射到应用程序的地址空间。这通常是由于取消引用空指针或被小整数值损坏的指针造成的。这报告为SEGV_MAPERR.SEGV_MAPERR的分类文档(索引Linux源代码)在这里:https://elixir.bootlin.com/linux/latest/A/ident/SEGV_MAPER

linux - 什么是 SEGV_MAPERR?

什么是SEGV_MAPERR,为什么总是想出SIGSEGV? 最佳答案 有两种常见的SEGV,这是由于内存访问无效导致的错误:访问了具有错误权限的页面。例如,它是只读的,但您的代码试图写入它。这将报告为SEGV_ACCERR.访问的页面根本没有映射到应用程序的地址空间。这通常是由于取消引用空指针或被小整数值损坏的指针造成的。这报告为SEGV_MAPERR.SEGV_MAPERR的分类文档(索引Linux源代码)在这里:https://elixir.bootlin.com/linux/latest/A/ident/SEGV_MAPER

regex - linux查找正则表达式

我在使用find命令的正则表达式时遇到问题。可能是我不明白在命令行上转义的东西。为什么这些不一样?find-regex'.*[1234567890]'find-regex'.*[[:digit:]]'Bash、Ubuntu 最佳答案 你应该看看find的-regextype参数,见manpage:-regextypetypeChangestheregularexpressionsyntaxunderstoodby-regexand-iregextestswhichoccurlateronthecommandline.Currentl

regex - linux查找正则表达式

我在使用find命令的正则表达式时遇到问题。可能是我不明白在命令行上转义的东西。为什么这些不一样?find-regex'.*[1234567890]'find-regex'.*[[:digit:]]'Bash、Ubuntu 最佳答案 你应该看看find的-regextype参数,见manpage:-regextypetypeChangestheregularexpressionsyntaxunderstoodby-regexand-iregextestswhichoccurlateronthecommandline.Currentl

我可以假设 long int 的大小总是 4 个字节吗?

longint(据我了解是long的同义词)总是4个字节是否总是正确的?我可以依赖它吗?如果不是,那么对于基于POSIX的操作系统来说是不是真的? 最佳答案 除了char之外,标准没有说明任何整数类型的确切大小。通常,long在32位系统上为32位,在64位系统上为64位。然而,该标准确实指定了最小大小。来自CStandard的第5.2.4.2.1节:1Thevaluesgivenbelowshallbereplacedbyconstantexpressionssuitableforusein#ifpreprocessingdire