Articles of c + +

从持续更新的文件中读取

我正在编写一些C代码来处理文件中的一些数据,但我刚刚知道文件将不断添加到(大约1次/秒,也许更快)。 所以我想知道如何继续阅读文件,因为它被添加到。 然后,当我到最后,等到下一行被添加,然后处理它。 然后再等待,然后处理,依此类推。 我有这样的东西: while(1){ fgets(line, sizeof(line), file); while(line == NULL){ //wait ? then try to read again? } //tokenize line and do my stuff here } 我以为我可以用inotify,但是我没有办法。 有人有build议吗?

发送固定长度的TCP帧

我需要使用TCP在固定的非标准MTU(例如1560)的子网上发送一些数据。 如果帧的长度小于MTU,则通过该子网传输的所有以太网帧都应手动填充0。 所以,数据大小应该是(1560 – sizeof(IP头) – sizeof(TCP头))。 这是我要这样做的方式: 我设置了TCP_CORK选项来减less数据的分段。 这是不可靠的,因为有200毫秒的天花板,但它的工作原理。 我知道IP头的大小(20字节),所以数据长度应该等于(1540 – sizeof(TCP头))。 那就是问题所在。 我不知道TCP头的大小。 它的“选项”字段的大小是浮动的。 所以,问题是:如何获得TCP头的大小? 或者也许有一些方法发送TCP帧与固定长度的头?

如何知道C程序的可执行文件是在前台还是后台运行的?

在我的C程序中,我想知道我的可执行文件是否像这样在前台运行 $./a.out 或者像这样 $./a.out &

c atoi()在Linux上的宽字符?

是否有相当于Linux上宽字符的ac atoi()? 我可以findMS(wtoi)的东西,但我可以在标准的Linux库中find任何东西。

使用UNIX套接字将文件描述符从同一主机上的一个程序传递到另一个程序

我有两个prpr让我们说prog1和prog2。 我正在用prog1打开一个文件,并对它进行一些操作。 现在没有在prog1中closures文件,我使用unix套接字将其文件描述符发送到prog2,然后在其中执行一些操作。 虽然我得到了相同的描述符,我在prog1中传递,但是在prog2中接收到的fd上执行fstat()时会抛出错误,说错误的文件描述符。 我已经在prog1中打开了文件,其中corerct权限是读取和写入的,但仍然出现错误。 为什么会这样呢? 如果我的方式传递文件描述符是错误的,那么请build议一个正确的。

在gdb下运行时,SSL_library_init会导致SIGILL

试图使用gdbdebugging程序,它报告OPENSSL_cpuid_setup中的SIGILL失败。 有了这个简单的代码,我有相同的行为: #include <openssl/ssl.h> int main() { SSL_library_init(); } 它编译和运行良好,但从跟踪回溯开始gdb报告 Program received signal SIGILL, Illegal instruction. 0xb6b2eb40 in ?? () from /usr/lib/arm-linux-gnueabihf/libcrypto.so.1.0.0 (gdb) where #0 0xb6b2eb40 in ?? () from /usr/lib/arm-linux-gnueabihf/libcrypto.so.1.0.0 #1 0xb6b2b404 in OPENSSL_cpuid_setup () from /usr/lib/arm-linux-gnueabihf/libcrypto.so.1.0.0 #2 0xb6fdf058 in call_init (l=<optimized out>, argc=1, argv=0xbefff7d4, env=0xbefff7dc) at dl-init.c:78 #3 0xb6fdf134 in _dl_init (main_map=0xb6fff958, argc=1, […]

Linux使用boost asio拒绝套接字绑定的权限

我遇到了一个绑定套接字的问题,当我以用户的身份运行该程序时,我拒绝了permision。 这行代码会产生一个错误。 _acceptor = new boost::asio::ip::tcp::acceptor(io, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), serverPort)); 错误是 terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >' 什么():绑定:权限被拒绝 但是,如果我以root身份运行它工作正常。 我试过禁用apparmor和防火墙 sudo service apparmor stop sudo ufw disable 但我仍然有这个问题。 我错过了什么可以否认permision? 我真的很想弄清楚这一点,因为我不喜欢运行我的IDE和一个未经证实的程序作为根。 我正在运行安装了所有更新的xubuntu 13.10。

通过设备文件符号链接查找总线编号和设备编号

我有一个由udev规则生成的设备文件( SYMLINK ) /dev/CDMAModem 。 我想查找实际设备的总线编号和设备编号。 其实我想在我的C ++程序中执行设备/dev/bus/usb/BUS_NO/DEVICE_NO上的USBDEVFS_RESET ioctl。 —- udev规则—- SUBSYSTEMS=="usb", ACTION=="add", DRIVERS=="zte_ev", ATTRS{bNumEndpoints}=="03", SYMLINK+="CDMAModem" SUBSYSTEMS=="usb", ACTION=="remove", DRIVERS=="zte_ev", ATTRS{bNumEndpoints}=="03", SYMLINK-="CDMAModem"

libusb中断传输

我需要逆向devise一个用于定制HID USB设备的驱动程序(控制面板上的一些button和LED)。 驱动程序仅在Windows上可用,我们需要* nix实现。 该设备显然是一个HID设备,虽然不是一个特定的类。 它提供了两个接口,每个接口都有一个中断端点。 我的设置目前涉及一个在Ubuntu主机上运行Windows的VirtualBox,通过Wireshark捕获USBstream量。 协议是相当简单的,我已经获得了相当好的理解。 我在一个简单的C ++控制台程序中使用libusb-1.0进行原型devise。 我已经设法通过发出一个SET_REPORT控制传输来切换LED,但是在传输中通过中断来接收button的努力。 事实上,以下呼吁块永远: unsigned char bytes[8] = { 0 }; int len = 0; int ret = libusb_interrupt_transfer(handle, 0x81, bytes, 8, &len, 0); 在Wireshark中检查生成的URB时,它看起来就像在Windows会话中捕获的相同。 但我从来没有从设备得到答复。 我摔倒了,我错过了一些设置。 请注意,设备已正确打开,设备提供的两个界面都已获得成功声明。 即使在我的Linux应用程序中,通过控制传输的input报告也正在低谷。 感谢任何指针! 阿恩 附录I:我想知道如何在使用libusb_interrupt_transfer()时指定要接收哪个报告ID? 附录二:当比较Windows驱动程序与Wireshark中的上述代码生成的请求时,我看不到任何区别(URB中的值相同)。 但是,只有当Windows驱动程序发出中断传输时才会返回。 当在Wireshark中检查Windows驱动程序通信时,除了各种GET_DESCRIPTOR(…)之外,我没有看到任何控制转移。 最重要的是:没有SET_INTERFACE或SET_CONFIGURATION因此,我怀疑问题是关于图书馆或我如何使用它,并与设备无关。

在C中每x秒执行一次方法

有没有一个工作计时器的例子,每隔X秒钟使用C执行一些函数 我会很感激一个工作代码的例子。