-3

我有一个程序,每次收到信号 SIGUSR2 时都需要从文件中读取一行。除了如何准确地阅读一行之外,我做了所有的事情。

文件内容:

one
two
three
four
five
...
ten
4

3 回答 3

4

使用fgets()函数....它将读取直到换行符出现...否则您可以在获取 /n 时使用 fgetc 读取一个字符一个字符,然后您可以结束您的读取操作

于 2013-04-16T10:37:10.403 回答
3

正如 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)需要一个实现来保证可以在信号处理程序中安全地调用以下函数:

[名单删减,名单见上方链接]

于 2013-04-20T12:45:19.157 回答
2

您可以使用fscanf()

fscanf(fp, " %[^\n]",buffer);

这允许从您的文件中读取一行。

每次您想从文件中读取 1 行时调用它

笔记:

  1. 使用时必须小心。如果该行大于buffer大小,则会导致溢出。您必须确保您使用的缓冲区大小始终大于每行的大小。

  2. 如果文件中的行以空格开头(在isspace()中定义),那么这些空格将不会被复制

于 2013-04-16T10:37:35.680 回答