我有一个程序,每次收到信号 SIGUSR2 时都需要从文件中读取一行。除了如何准确地阅读一行之外,我做了所有的事情。
文件内容:
one
two
three
four
five
...
ten
使用fgets()
函数....它将读取直到换行符出现...否则您可以在获取 /n 时使用 fgetc 读取一个字符一个字符,然后您可以结束您的读取操作
正如 OP 所暗示的,数据应该从信号处理程序中读取,这是使用它的唯一方法read()
,因为这是最近版本提到的唯一man 7 signal
可以从信号处理程序中调用的函数。有关这方面的详细信息,请在此处阅读:http: //pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html
读取一行 viaread()
可以实现逐字节读取,直到找到 EOL 字符。
在读取之前,不清楚需要读取多少数据才能找到 EOL,或者需要定义最大值,然后可以使用该最大值来声明要读取的缓冲区,或者需要动态增加缓冲区大小同时循环read()
。
更新:
摘录形式man 7 signal
(我在方括号中评论):
异步信号安全功能
信号处理函数必须非常小心,因为其他地方的处理可能会在程序执行的某个任意点被中断。POSIX 有“安全功能”的概念。如果信号中断了不安全函数的执行,并且处理程序调用了不安全函数,则程序的行为是未定义的。
POSIX.1-2004(也称为 POSIX.1-2001 Technical Corrigendum 2)需要一个实现来保证可以在信号处理程序中安全地调用以下函数:
[名单删减,名单见上方链接]
您可以使用fscanf()
fscanf(fp, " %[^\n]",buffer);
这允许从您的文件中读取一行。
每次您想从文件中读取 1 行时调用它
笔记:
使用时必须小心。如果该行大于buffer
大小,则会导致溢出。您必须确保您使用的缓冲区大小始终大于每行的大小。
如果文件中的行以空格开头(在isspace()中定义),那么这些空格将不会被复制