我有一个程序,每次收到信号SIGUSR2时都需要从文件中读取一行。除了如何读取一行之外,我做了一切。
文件内容:
one
two
three
four
five
...
ten
答案 0 :(得分:4)
使用fgets()
函数....它将读取直到换行...或者你可以通过使用fgetc读取一个char,当你得到/ n然后你可以结束你的阅读操作< / p>
答案 1 :(得分:3)
由于OP意味着应该从信号处理程序读取数据,因此唯一的方法是使用read()
,因为这是man 7 signal
的最新版本提到的唯一函数。从信号处理程序中省略地调用。有关详情,请参阅此处:http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html
通过read()
读取一行可以逐字节读取,直到找到EOL字符。
在阅读之前,不清楚需要读取多少数据才能找到EOL,或者需要定义最大值,然后可以用来声明要读取的缓冲区,或者缓冲区大小需要在read()
循环时动态增加。
<强>更新强>
摘录形式man 7 signal
(由方括号评论):
异步信号安全功能
信号处理函数必须非常小心,因为其他地方的处理可能会在程序执行的某个任意点中断。 POSIX具有“安全功能”的概念。如果信号中断了 执行不安全的函数,并且处理程序调用不安全的函数,然后程序的行为是未定义的。
POSIX.1-2004(也称为POSIX.1-2001技术勘误2)要求实现以保证在信号处理程序中可以安全地调用以下函数:
[列出剪切,请参阅上面的链接列表]
答案 2 :(得分:2)
您可以使用fscanf()
fscanf(fp, " %[^\n]",buffer);
这允许从您的文件中读取一行。
每次要从文件中读取1行时调用它
注意:
使用它时必须小心。如果该行大于buffer
大小,则会导致溢出。你必须确保你使用的缓冲区大小总是大于每行的大小。
如果文件中的行以空格开头(在isspace()中定义),那么这些空格将不会被