标签: stdio

如何从任何线程安全地使用 exit()

根据手册页 (2),该exit函数不是线程安全的: ,这是因为该函数尝试通过调用使用和MT-Unsafe race:exit注册的回调来清理资源(将数据刷新到磁盘、关闭文件描述符等...)。我希望我的程序能够做到这一点!(我的一个线程在整个程序的生命周期中保持文件描述符打开,所以这对我来说不是一个选择,因为我希望将所有数据写入输出文件)on_exitatexit_exit

我的问题如下:如果我很小心并且我不在线程之间共享任何敏感数据(如 fd),那么exit在多线程程序中调用是否“可接受”?请注意,我仅exit在发生不可恢复的错误时才调用。然而,当程序尝试退出时,我无法承受段错误。问题是,任何线程都可能发生不可恢复的错误......

我正在考虑使用 setjmp/longjmp “很好地”终止我的线程,但这会非常复杂,并且需要在我的代码中进行许多更改。

任何建议将不胜感激。谢谢 !:)

编辑:感谢@Ctx启发,我想出了以下想法:

#define EXIT(status) do { pthread_mutex_lock(&exit_mutex); exit(status); } while(0)

当然,exit_mutex 必须是全局的(外部)。

c multithreading stdio atexit thread-safety

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

C - 编译程序时出现多个警告“指针缺少可空性类型说明符”,我该怎么办?

我最近开始在编译 C 程序时遇到问题,从stdio.hstdlib.h等不同的 C 包中收到 10、20 或 100 个警告。

警告有所不同,但通常是这样说的:

/usr/local/include/_stdio.h:93:16: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or
      _Null_unspecified) [-Wnullability-completeness]
        unsigned char   *_base;
Run Code Online (Sandbox Code Playgroud)

我的程序仍然可以编译并运行良好,但我担心这需要修复,而且在终端中收到所有这些警告也非常烦人。

我几乎可以肯定这些警告在我将系统更新到 macOS Catalina 后开始显示,但我不知道从哪里开始解决它。

更具体地说,当我像这样编译一个简单的helloworld.c程序时

#include <stdio.h>

int main (void) {
    printf("Hello World!"); 
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

使用以下命令:

make helloworld 
Run Code Online (Sandbox Code Playgroud)

或者

gcc helloworld.c -o helloworld 
Run Code Online (Sandbox Code Playgroud)

..我收到以下警告,即使程序实际编译。

In file included from helloworld.c:1:
In file included from /usr/local/include/stdio.h:64:
/usr/local/include/_stdio.h:93:16: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, …
Run Code Online (Sandbox Code Playgroud)

c macos stdio clang macos-catalina

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

当输入行结尾混合时,std :: getline替代

我试图从a读取行,std::istream但输入可能包含'\r' 和/或 '\n',所以std::getline没有用.

很抱歉大喊,但这似乎需要强调......

该输入可以包含任一换行类型或两者.

有没有标准的方法来做到这一点?目前我正在努力

char c;
while (in >> c && '\n' != c && '\r' != c)
    out .push_back (c);
Run Code Online (Sandbox Code Playgroud)

......但这会跳过空白.D'哦!std::noskipws- 需要更多的摆弄,现在它是misehaving.

当然必须有更好的方法吗?!?

c++ stdin stdio line-endings istream

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

使用 node.js 获取正在运行的进程的 stdin/stdout

我正在从带有child_process.spawn 的节点开始一个进程并处理 process.stdout/stderr 数据事件,并写入标准输入。

现在,我的节点应用程序可能会崩溃或停止,当它重新启动时,我通过它的 PID 找到进程,然后我想再次附加到进程的 stdin/stderr/stdout。

有问题的进程可能是任何类似守护进程的程序,所以我无法控制它的行为(例如,我无法设置进程以在收到信号时重定向它的 stdio)。

我正在考虑使用 screen 包装进程,将 stdio 重定向到一个 FIFO 文件(但在节点 6 中不推荐使用 customFds 选项),但这些似乎都不像 process.stdin.on 那样干净......

process stdio node.js

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

缓冲标准I/O库

UNIX环境中的高级编程(第2版)一书中,作者在第5.5节(标准I/O库的流操作)中写道:

打开文件进行读写(类型中的加号)时,以下限制适用.

  • 输出不能直接跟随输入而没有中间fflush,fseek,fsetpos,或rewind.
  • 输入不能直接跟随输出而没有中间fseek,fsetposrewind,或输入其遇到文件结束操作.

我对此感到困惑.谁能解释一下这个呢?例如,在什么情况下输入和输出函数调用违反上述限制会导致程序出现意外行为?我想这些限制的原因可能与库中的缓冲有关,但我不太清楚.

c stdio buffering

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

对fclose进行适当的错误处理是不可能的(根据联机帮助页)?

所以我正在研究fclose manpage,我的结论是,如果fclose被某些信号中断,根据联机帮助页有没有办法恢复......?我错过了一些观点吗?

通常,使用无缓冲的POSIX功能(打开,关闭,写入等),总有一种方法可以通过重新启动呼叫来从信号中断(EINTR)中恢复; 相反,缓冲调用的文档说明在fclose尝试失败后,另一个尝试有未定义的行为...没有关于如何恢复的提示.如果信号中断fclose,我只是"不幸"吗?数据可能会丢失,我无法确定文件描述符是否实际关闭.我知道缓冲区已被释放,但文件描述符呢?想想大规模的应用程序同时使用很多fd的,并且如果fd没有被正确释放会遇到问题 - >我会假设必须有一个CLEAN解决方案来解决这个问题.

所以我们假设我正在编写一个库,并且不允许使用sigaction和SA_RESTART并且发送了大量信号,如果fclose被中断,我该如何恢复?fclose与EINTR失败后,在循环(而不是fclose)中调用close是不是一个好主意?fclose的文档根本没有提到文件描述符的状态; 但是,UNDEFINED并不是很有帮助...如果fd关闭并且我再次调用close,可能会发生奇怪的难以调试的副作用,所以我宁愿忽略这种情况,因为做了错误的事情......然后再次,那里没有无限数量的文件描述符可用,资源泄漏是某种错误(至少对我而言).

当然我可以检查fclose的一个具体实现,但我不相信有人设计了stdio并且没有想到这个问题?它只是文档是坏的还是这个功能的设计?

这个角落案件真的让我感到困惑:(

c linux stdio eintr fclose

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

通过inode打开文件

知道它的inode是否可以打开文件?

ls -i /tmp/test/test.txt
529965 /tmp/test/test.txt
Run Code Online (Sandbox Code Playgroud)

我可以提供路径,inode(529965以上),我希望得到一个文件描述符.

linux filesystems stdio

7
推荐指数
2
解决办法
5345
查看次数

fwrite是否刷新'\n'上的缓冲区?

我有自己的执行_open(),_close(),_write(),_read().

我的代码:

FILE *f = fopen("0:test", "wb");  // calls _open()
fwrite("hello ", 6, 1, f);
fwrite("world\r\n\0", 8, 1, f); // calls _write(3, "hello world\r\n", 13)
fflush(f);                      // calls _write(3, "\0", 1)
fclose(f);                      // calls _close(3)
Run Code Online (Sandbox Code Playgroud)

BUFSIZE 是1024

编译器:arm-none-eabi-gcc/版本:5.4.1

即使我有旗帜,为什么要fwrite()解释?'\n'"wb"

是否fopen()解释文件名"0:test"

c stdio stm32 newlib

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

可以在循环中多次使用 getline() 吗?- Cython,文件读取

我想读取一个 4 行 4 行的文件(它是一个带有 DNA 序列的 fastq 文件)。
当我一行一行或一行一行地读取文件时,没有问题,但是当我一次读取 3 或 4 行时,我的代码崩溃了(内核似乎在 jupyter notebook 上死了)。(取消注释最后一部分,或 4 中的任何 3 部分getline()
我尝试使用 char (char**) 的双数组来存储行,但存在相同的问题。

知道是什么原因吗?

使用 Python 3.7.3、Cython 0.29,更新了所有其他库。正在读取的文件大约为 1.3GB,机器有 8GB,ubuntu 16.04。代码改编自https://gist.github.com/pydemo/0b85bd5d1c017f6873422e02aeb9618a

%%cython
from libc.stdio cimport FILE, fopen, fclose, getline
    
def fastq_reader(early_stop=10):
    cdef const char* fname = b'/path/to/file'
    cdef FILE* cfile
    cfile = fopen(fname, "rb")

    cdef:
        char * line_0 = NULL
        char * line_1 = NULL
        char * line_2 = NULL
        char * line_3 …
Run Code Online (Sandbox Code Playgroud)

python stdio getline cython file-read

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

未解析的外部符号 __stdio_common_vswprintf

我正在编译使用 Microsoft Dmf 框架 (DmfK.lib) 的内核模式驱动程序

在上次 Visual Studio 更新之后,出现了一些奇怪的链接器错误:

EmulationTargetPDO.obj : error LNK2019: unresolved external symbol __stdio_common_vswprintf referenced in function _vsnwprintf_l
Utilities.lib(savedata.obj) : error LNK2001: unresolved external symbol __stdio_common_vswprintf
DmfK.lib(DmfUtility.obj) : error LNK2001: unresolved external symbol __stdio_common_vswprintf
EmulationTargetPDO.obj : error LNK2019: unresolved external symbol __stdio_common_vsprintf referenced in function _vsnprintf_l
DmfK.lib(DmfCore.obj) : error LNK2001: unresolved external symbol __stdio_common_vsprintf
DmfK.lib(Dmf_CrashDump.obj) : error LNK2019: unresolved external symbol __stdio_common_vsprintf_s referenced in function _vsprintf_s_l
Run Code Online (Sandbox Code Playgroud)

这是我使用的软件和套件版本(显示在 VS“关于”窗口中):

  • Microsoft Visual Studio Professional 2019 版本 16.10.0
  • Windows …

printf stdio wdk unresolved-external

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