Questions tagged «linux»

LINUX问题必须与编程有关。仅当您的问题与使用Linux API或Linux特定行为进行编程有关时才使用此标记,而不仅仅是因为您碰巧在Linux上运行代码。如果需要Linux支持,可以尝试https://unix.stackexchange.com或特定Linux发行版的Stack Exchange网站,例如https://askubuntu.com或https://elementaryos.stackexchange.com/


10
Linux中的守护程序日志记录
因此,我有一个在Linux系统上运行的守护程序,并且我想要记录其活动:日志。问题是,完成此任务的“最佳”方法是什么? 我的第一个想法是简单地打开一个文件并将其写入。 FILE* log = fopen("logfile.log", "w"); /* daemon works...needs to write to log */ fprintf(log, "foo%s\n", (char*)bar); /* ...all done, close the file */ fclose(log); 用这种方式记录日志有天生的错误吗?有没有更好的方法,例如Linux内置的某些框架?
67 c  linux  logging  daemon 


1
3>&1隐含4>&3 5>&3等吗?
我希望 echo foo | tee /proc/self/fd/{3..6} 3>&1 因/ proc / self / fd / 4之类的错误而失败:没有此类文件或目录等,但令我惊讶的是,它输出 foo foo foo foo foo 就像3>&1导致以下所有描述符都重定向到stdout一样,除非如果我更改3为其他内容则不起作用,例如 $ echo foo | tee /proc/self/fd/{3..6} 4>&1 tee: /proc/self/fd/3: No such file or directory tee: /proc/self/fd/5: No such file or directory tee: /proc/self/fd/6: No such file or directory foo …

1
为什么连续写入会在缓冲区中保留4K字节?
我基本上有以下代码: int fileWrite(int file, void * pBuffer, size_t size) { size_t bytesWritten = (size_t)write( file, pBuffer, size ) ; if (bytesWritten != size) { return -1; } return 0; } 如果大小为1GB,则可以使用,但是当大小为〜2GB时,则可以连续保留4K字节。我可以通过将写操作包装在循环中并向上移动缓冲区来解决此问题,但是我很好奇为什么它总是失败。 例如,如果大小为2147483648,则只写2147479552,而使4096不写。为什么会发生这种情况,并且总是将写操作包装在循环中是否正确?
30 c  linux  system-calls 

1
为什么即使ASLR开启,__ libc_start_main的地址在GDB中也总是相同的?
Breakpoint 1, 0x00007ffff7de8060 in __libc_start_main () from /usr/lib/libc.so.6 (gdb) r The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/firstlove/projects/org-ioslide/example/a.out Breakpoint 1, 0x00007ffff7de8060 in __libc_start_main () from /usr/lib/libc.so.6 (gdb) r The program being debugged has been started already. Start it …
16 c  linux  gdb  libc  aslr 

2
dma_mmap_coherent()映射内存的零拷贝用户空间TCP发送
我正在Cyclone V SoC上运行Linux 5.1,这是一个FPGA,在一个芯片中具有两个ARMv7内核。我的目标是从外部接口收集大量数据,并通过TCP套接字流出(部分)这些数据。这里的挑战是数据速率非常高,并且可能接近饱和GbE接口。我有一个write()可行的实现,该实现只使用对套接字的调用,但其最高速度为55MB / s;大约是理论GbE限制的一半。我现在正在尝试使零拷贝TCP传输能够提高吞吐量,但是我遇到了麻烦。 为了将数据从FPGA传送到Linux用户空间,我编写了一个内核驱动程序。该驱动程序使用FPGA中的DMA块将大量数据从外部接口复制到连接到ARMv7内核的DDR3存储器中。当使用dma_alloc_coherent()with 进行探测时GFP_USER,驱动程序将该内存分配为一堆连续的1MB缓冲区,并通过mmap()在文件中实现并将这些/dev/地址返回给应用程序,将这些缓冲区公开给用户空间应用程序。dma_mmap_coherent()预分配的缓冲区。 到目前为止,一切都很好; 用户空间应用程序正在查看有效数据,吞吐率大于360MB / s时,还有足够的余量(外部接口的速度不够快,无法真正看到上限)。 为了实现零拷贝TCP网络,我的第一种方法是SO_ZEROCOPY在套接字上使用: sent_bytes = send(fd, buf, len, MSG_ZEROCOPY); if (sent_bytes < 0) { perror("send"); return -1; } 但是,这导致send: Bad address。 谷歌搜索了一段时间之后,我的第二种方法是使用管道,splice()然后执行以下操作vmsplice(): ssize_t sent_bytes; int pipes[2]; struct iovec iov = { .iov_base = buf, .iov_len = len }; pipe(pipes); sent_bytes …

3
无法加载动态库“ libnvinfer.so.6”
我正在尝试正常导入TensorFlow python软件包,但出现以下错误: 这是上面终端图像中的文本: 2020-02-23 19:01:06.163940: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libnvinfer.so.6'; dlerror: libnvinfer.so.6: cannot open shared object file: No such file or directory 2020-02-23 19:01:06.164019: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libnvinfer_plugin.so.6'; dlerror: libnvinfer_plugin.so.6: cannot open shared object file: No such file or directory 2020-02-23 19:01:06.164030: W …

5
缺少inotify事件(在.git目录中)
我正在使用inotify事件(恰好发生在Python中,调用libc)来监视文件中的更改。 对于a期间的某些文件git clone,我看到了一些奇怪的事情:我看到一个IN_CREATE事件,并且通过ls它看到该文件包含内容,但是,我从未看到IN_MODIFY或IN_CLOSE_WRITE。因为我要IN_CLOSE_WRITE对文件做出响应,这导致了我的问题:具体来说,是启动文件内容的上载。 行为异常的文件位于.git/objects/pack目录中,并以.pack或结尾.idx。git创建的其他文件具有更规则的IN_CREATE-> IN_MODIFY-> IN_CLOSE_WRITE链(我不在监视IN_OPEN事件)。 这是在MacOS上的docker内部,但是我已经看到在远程系统上的Linux上的docker上有相同的证据,因此我怀疑MacOS方面是不相关的。如果正在观看并且git clone在同一个 Docker容器中,我会看到这个。 我的问题: 为什么这些文件上缺少这些事件? 该怎么办?具体来说,我该如何回应对这些文件的写入完成?注意:理想情况下,我想在“完成”书写时做出响应,以避免不必要地/(不正确地)上传“未完成”的书写。 编辑:阅读https://developer.ibm.com/tutorials/l-inotify/看来我所看到的与 一个单独的临时文件,其名称如tmp_pack_hBV4Alz,正在创建,修改和关闭; 将以最终名称创建到该文件的硬链接.pack; 原始tmp_pack_hBV4Alz名称被删除。 我认为我的问题是尝试使用inotify作为上载文件的触发器,然后简化为注意到该.pack文件是与另一个文件的硬链接,并且在这种情况下上载?
11 linux  git  docker  libc  inotify 

1
lsb_release:在最新的Ubuntu Docker容器中找不到命令
我只是想快速测试一下。所以我运行了一个Docker容器,我想查看我正在运行哪个版本: $ docker run -it ubuntu root@471bdb08b11a:/# lsb_release -a bash: lsb_release: command not found root@471bdb08b11a:/# 所以我尝试安装它(如此处建议): root@471bdb08b11a:/# apt install lsb_release Reading package lists... Done Building dependency tree Reading state information... Done E: Unable to locate package lsb_release root@471bdb08b11a:/# 有人知道为什么这不起作用吗?

5
动态链接-Linux与。视窗
在Windows下,当我在MSVC的DLL项目中编译C / C ++代码时,我得到2个文件: MyDll.dll MyDll.lib 据我了解,MyDll.lib其中包含某种指示符表,用于指示dll中的函数位置。使用此dll时(例如在exe文件中),MyDll.lib在链接期间会嵌入到exe文件中,因此在运行时它“知道”函数的位置MyDll.dll并可以使用它们。 但是,如果我在Linux下编译相同的代码,我只会得到一个MySo.so不带 文件的文件MySo.a(相当于libLinux中的文件),那么MySo.so如果在链接过程中未嵌入任何内容,Linux下的可执行文件如何知道函数的位置?

1
防止进程在Linux上打开新的文件描述符,但允许通过套接字接收文件描述符
我目前在一个项目中,我有一个父进程来设置套接字对,派生然后使用此套接字对进行通信。子级如果要打开文件(或任何其他基于文件描述符的资源),应始终转到父级,请求资源并fd通过套接字对获取发送。此外,我想防止孩子自己打开任何文件描述符。 我偶然发现setrlimit哪个成功阻止了子进程打开新的文件描述符,但是这似乎也使通过初始套接字连接发送的任何文件描述符无效。Linux上是否有任何方法允许单个进程打开任何文件,将其文件描述符发送给其他进程并允许他们使用它们,而又不允许这些其他进程自己打开任何文件描述符? 对于我的用例,可以是任何内核配置,系统调用等,只要可以在fork之后应用,并且可以应用于所有文件描述符(不仅是文件,还可以是套接字,套接字对等)。
9 c  linux  system-calls 

1
哪种Linux驱动程序子系统/ API用于简单的屏幕/监视器设备?
我正在开发带触摸屏的嵌入式系统。触摸屏既可作为输入也可作为输出,而“虚拟”键盘则覆盖图形输出。 我有一个工作的设备驱动程序,该驱动程序可以从触摸传感器读取输入并将其正确转换为按键,这是在kernel.org上的本指南的帮助下创建的。我想扩展此驱动程序以处理图像输出到屏幕上。 我想同时支持getty和X,并尽可能减少重复。我正在运行带有精挑细选软件包的最小Debian变体,例如最小X。请注意,尽管我可能会将其转储到公共GitHub存储库中,但我并不打算尝试将该驱动程序放入存储库管道中。 目前,输出屏幕图像是通过一个棘手的解决方法完成的:一个引导选项,即使未连接到显示器,也可以强制渲染到CPU的嵌入式图形硬件;还有一个守护程序,该屏幕不断地对刮擦进行缓冲,从而修改了少数预定义像素以创建键盘视觉效果,并将其推出到实际屏幕。 这可以作为概念证明,证明我正确理解了屏幕设备期望的语言,但显然不是最佳选择。 kernel.org 也有“ DRM”设备驱动程序的指南,但是对于我的硬件能够做到的事情,这似乎严重过头了: Linux DRM层包含旨在满足复杂图形设备需求的代码,通常包含非常适合3D图形加速的可编程管线。 我的硬件都没有类似于3D加速的东西,因此我得出结论,这可能不是我想要的。 我应该使用哪个子系统/ API?我认为缺少术语是阻止我搜索的原因,但是有关如何完成此操作的更多信息将不胜感激。 硬件详细信息(可能不相关): CPU和屏幕通过8080式并行协议进行通信,CPU本身不支持该协议,因此我使用GPIO(通过mmap操纵寄存器)对其进行了仿真。 发送完整的屏幕图像大约需要20毫秒,但是从嵌入式图形缓冲区中获取完整的副本大约需要180毫秒,因此跳过这一步是最重要的目标。屏幕硬件包括足够的SGRAM存储器以保持整个帧的数据价值,并支持写入矩形子区域,因此希望使用仅更新屏幕已更改部分的钩子。 该屏幕并不特别关注输入数据的时间。触摸传感器输入由专用IC处理,该IC通过CPU支持的I²C与CPU通信。本驱动程序使用该linux/input-polldev.h接口。CPU是Broadcom BCM2835,屏幕是带有嵌入式Himax HX8357控制器的TFT ,触摸屏传感器解码器是ST STMPE610,HX8357和BCM2835之间有一个电压电平转换器(Nexperia 74LVCH245A)。可根据要求提供更多详细信息。

3
使用NON GNU awk将修改保存到位
我遇到了一个问题(关于SO本身),OP必须在其中进行编辑并将操作保存到Input_file(s)本身中。 我知道对于一个Input_file我们可以执行以下操作: awk '{print "test here..new line for saving.."}' Input_file > temp && mv temp Input_file 现在让我们说我们需要以相同类型的文件格式进行更改(在此处假设.txt)。 我为这个问题尝试/想到的方法:它的方法是遍历.txt文件的for循环,并且调用singleawk是一个痛苦且不建议的过程,因为这将浪费不必要的cpu​​周期,并且对于更多数量的文件,它将更多慢。 因此,可以使用awk不支持inplace选项的NON GNU对多个文件执行就地编辑。我也经历了这个线程,用awk将修改保存到位,但对于NON GNU awk副工具和更改其内部的多个文件并没有多大作用awk,因为非GNU awk将没有inplace选择权。 注意:为什么要添加bash标签,因为在答案部分中,我已经使用bash命令将临时文件重命名为其实际的Input_file名称,因此添加了它。 编辑:根据Ed先生的评论,在此处添加了示例示例,尽管该线程代码的目的也可以由通用目的就地编辑使用。 样本输入文件: cat test1.txt onetwo three tets testtest cat test2.txt onetwo three tets testtest cat test3.txt onetwo three tets testtest 预期输出样本: cat test1.txt 1 2 cat …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.