小编Mau*_*aus的帖子

如果指向的文件被移动,那么Linux上的打开文件句柄会发生什么

如果指向文件同时获得Linux上的打开文件句柄会发生什么:

  • 搬走了 - >文件句柄是否保持有效?
  • 已删除 - >这是否会导致EBADF,表明文件句柄无效?
  • 替换为新文件 - >文件句柄是否指向此新文件?
  • 替换为新文件的硬链接 - >我的文件是否处理"关注"此链接?
  • 替换为新文件的软链接 - >我的文件句柄现在是否触及此软链接文件?

为什么我问这样的问题:我使用的是热插拔硬件(如USB设备等).可能发生的是,设备(及其/ dev /文件)被用户或另一个Gremlin重新附加.

处理这个问题的最佳做法是什么?

linux file-io file linux-kernel systems-programming

96
推荐指数
3
解决办法
4万
查看次数

是否值得插入`const`-correctness

我目前面临的是由一些高级程序员编写的C++项目,该项目由大约400个文件和200个类组成.

代码精心编写,工作正常,稳定.

虽然我正在添加一些功能,但对我而言,通常的做法是注意 - const正确性.

但是,如果我开始声明我的新成员函数const,那么为了使事情有效,调整旧代码是没有意义的.

  • 我应该投入大量时间在const这段代码中引入正确性吗?
  • 更糟糕的是,我必须触摸并改变旧的成熟代码,并向老年人解释我在代码审查期间所做的工作.这值得么?

c++ coding-style const-correctness

12
推荐指数
2
解决办法
647
查看次数

混合了32位和64位共享对象/库

不小心我在x86嵌入式Linux系统上混淆了32Bit和64Bit库文件.我现在正试图找出哪个.so-File可能是错误的.

你知道任何分析.so文件的工具吗?

在我的strace日志中,我发现了对fstat64()的调用.哪个.so文件包含fstat()例程?

谢谢

linux 64-bit shared-libraries

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

如何处理EINTR(中断的系统调用)

我的用户空间应用程序有时会在收到EINTR信号后以某种方式阻塞.

我用strace录制的内容:

time(NULL)                              = 1257343042
time(NULL)                              = 1257343042
rt_sigreturn(0xbff07be4)                = -1 EINTR (Interrupted system call)
--- SIGALRM (Alarm clock) @ 0 (0) ---
time(NULL)                              = 1257343042
futex(0xb7cea80c, 0x80 /* FUTEX_??? */, 2) = ? ERESTARTSYS (To be restarted)
--- SIGUSR1 (User defined signal 1) @ 0 (0) ---
sigreturn()                             = ? (mask now [ALRM])
futex(0xb7cea80c, 0x80 /* FUTEX_??? */, 2) = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
futex(0xb7cea80c, 0x80 /* FUTEX_??? */, 2) …
Run Code Online (Sandbox Code Playgroud)

c c++ linux

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

将std :: vector <char*>转换为c风格的参数向量arv

我想准备一个老派的参数向量(argv)在函数中使用

int execve(const char*filename,char*const argv [],char*const envp []);

我用stl :: vector类试了一下:

std::string arguments = std::string("arg1");    
std::vector<char*> argv; 
char argument[128];
strcpy(argument, arguments.c_str());
argv.push_back(argument); 
argv.push_back('\0'); // finish argv with zero
Run Code Online (Sandbox Code Playgroud)

最后我将向量传递给execve()

execve("bashscriptXY",&argv [0],NULL)

代码编译但是argV被execve()"忽略"了.所以这似乎是错的,我正在尝试.我应该如何使用c ++以有效的方式构建argV?

c++ vector exec argv

5
推荐指数
2
解决办法
3963
查看次数

C++/POSIX 如何以最有效的方式获取毫秒时间戳?

我正在使用开源库进行 i2c 总线操作。这个库经常使用一个函数来获取毫秒分辨率的实际时间戳。

示例调用:

nowtime = timer_nowtime();
while ((i2c_CheckBit(dev) == true) && ((timer_nowtime() - nowtime) < I2C_TIMEOUT));
Run Code Online (Sandbox Code Playgroud)

使用此 i2c 库的应用程序使用大量 CPU 容量。我发现,运行程序最多的时候是调用函数timer_nowtime()

原函数:

unsigned long timer_nowtime(void) {        
    static bool usetimer = false;
    static unsigned long long inittime;
    struct tms cputime;

    if (usetimer == false)
    {
        inittime  = (unsigned long long)times(&cputime);
        usetimer = true;
    }

    return (unsigned long)((times(&cputime) - inittime)*1000UL/sysconf(_SC_CLK_TCK));
}
Run Code Online (Sandbox Code Playgroud)

我现在的目标是,提高这个功能的效率。我是这样试的:

struct timespec systemtime;

clock_gettime(CLOCK_REALTIME, &systemtime);
//convert the to milliseconds timestamp
// incorrect way, because (1 / 1000000UL) …
Run Code Online (Sandbox Code Playgroud)

c++ linux posix timestamp

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

在业务逻辑应用程序中使用 swagger 生成的数据模型的最佳方法

我有一个 Python 程序,它封装了应用程序的业务逻辑。一个例子:

$ app pets list
[{
 "name": "Hasso",
 "age": 21
},{
 "name": "Lassy",
 "age": 15
 }]
Run Code Online (Sandbox Code Playgroud)

现在我想用Swagger.io实现一个 REST API 。YAML 的摘录如下所示:

 summary: Gets all dogs 
  produces:
  - application/json
  responses:
    200:
      description: array of dogs
      schema:
        type: array
        items:
        $ref: '#/definitions/Dog'
Run Code Online (Sandbox Code Playgroud)

Swagger-codgen 使用 Flask & connexion生成 python 代码并提供以下目录结构:

??? python-flask
    ??? swagger_server
        ??? controllers
        ??? models
        ??? __pycache__
        ??? swagger
        ??? test
Run Code Online (Sandbox Code Playgroud)

-目录中有所有使用的对象类型的类models

我想将 API-App 和 BL-App(业务应用程序)分开,但为了方便起见使用相同的模型。

将这些模型定义之间的模型定义共享给应用程序的最佳方式是什么?我还将这个 BL-App 导入 API-Project 以实现controllers-part。

python flask swagger connexion

5
推荐指数
0
解决办法
445
查看次数

在继承层次结构中使用boost :: shared_ptr

想象一下以下情况:

class IAlarm : public boost::enable_shared_from_this<IAlarm>  {
   boost::shared_ptr<IAlarm> getThisPointerForIAlarm() {
      return shared_from_this();
   }

   void verifyThis(int); // called by Device
};

class Alarm : public IAlarm {
   Alarm( boost::shared_ptr< Device >  attachedDevice){
      attachedDevice->attachAlarm(this->getThisPointerForIAlarm());
   }

   void sendAlarm(){
      attachedDevice->Alarm();
   } 

};

class Device {
   attachAlarm( boost::shared_ptr< IAlarm > ia){
      this->alarm=ia;
   }
};
Run Code Online (Sandbox Code Playgroud)

我想将警报连接到设备.警报和设备不允许彼此了解(这将最终呈现循环依赖性).这就是我使用Interface Class IAlarm的原因.最后,我希望能够将多个警报附加到一个设备上.警报可以访问它们所连接的设备,设备可以在附加的警报上开始验证

一切都很好.但是,如果我尝试将警报连接到设备,我会得到以下信息:

boost::shared_ptr<Device> ptrDevice(new Device());
boost::shared_ptr<IAlarm> ptrAlarm(new Alarm( ptrDevice ));

    terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_weak_ptr> >'

  what():  tr1::bad_weak_ptr
Run Code Online (Sandbox Code Playgroud)

究竟是什么问题?在使用boost::shared_ptr引用和纯指针之前,此设置或多或少有效.是否有可能使这项工作boost:shared_ptr

c++ inheritance boost

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

如何初始化静态成员

我想初始化两个静态数据成员.请参阅这两个文件

// Logger.h   

class Logger
{
    public:
        static LoggerConcrete error;
        static LoggerConcrete write;
};
Run Code Online (Sandbox Code Playgroud)

//Logger.cpp

Logger::error = LoggerConcrete(LOG_DEBUG);
Logger::write = LoggerConcrete(LOG_DEBUG);
Run Code Online (Sandbox Code Playgroud)

在Logger.cpp中启动两个静态成员不起作用.我得到以下编译器(g ++)错误:

g ++ -O0 -g3 -Wall -c -fmessage-length = 0 -MMD -MP -MF"Logger.d"-MT"Logger.d"-o"Logger.o""../ Logger.cpp".. /Logger.cpp:13:错误:在'='标记之前的预期构造函数,析构函数或类型转换../Logger.cpp:14:错误:在'='标记之前的预期构造函数,析构函数或类型转换

我想在包含Logger.h的每个类中使用Logger :: write和Logger :: error.我如何初始化这两个成员?

c++ static initialization

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

系统后获取子PID()

据我所知,system()调用在内部使用fork(),exec()但封装它们以便于处理.

是否可以从通过system()调用创建的子进程中获取PID ?

目标:我希望能够在一定的超时后SIGINT任何子进程.我可以system()使用fork()和重建函数exec().但我需要的只是孩子的PID,也许有使用的捷径system()

linux fork exec

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

为什么忽略具有相同源IP地址的组播消息

我实现了一个利用多播消息的网络发现过程.它允许发现具有连接到同一段的任何ip地址的特定设备.

客户端A发送多播消息,要求其他客户端.其他客户端使用多播消息"我在这里......"进行响应.基本上这很好用.

但有一个案例让我烦恼.

 Client A       Client B
192.168.2.5   192.168.2.5  
    |             |
     \__________ / 
         >>>
  UDP Multicast Message: 
  Source: 192.168.2.5 | Destination: 224.0.0.150
Run Code Online (Sandbox Code Playgroud)

可能会出现一致,即发送多播消息的客户端A和客户端B都监听相同的IP地址.在这种情况下,UDP数据包的源地址与目标客户端的IP地址相同.因此,客户端B上的应用程序不接收任何多播消息.

我想具有相同消息的多播消息被阻塞并丢弃在ip-stack中.有没有办法(套接字设置)接收它.

linux ip network-programming multicast

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