对于简单的任务,我使用 GNOME 文件(Nautilus)来复制文件,而不是 rsync。我尝试挖掘源代码nautilus-文件操作.c我对此并不熟悉,我假设它使用自己的自定义实现(不是cp
)进行错误处理和report_copy_progress
?我不知道实际的系统调用在哪里发生。
答案1
我相信所有 GNOME 文件操作都使用 GFiles,根据描述:
GFile 是用于在虚拟文件系统上操作文件的高级抽象。GFile 是轻量级、不可变的对象,在创建时不执行 I/O。必须了解的是,GFile 对象并不代表文件,而只是文件的标识符。所有文件内容 I/O 都以流式操作实现(请参阅 GInputStream 和 GOutputStream)。
因此 I/O 实际上是在输入流和输出流.c,在类似函数中输入流读取,但这依赖于一些读取函数GInputStreamClassclass->read_fn
,这取决于程序是从套接字、本地文件、win32 文件、可轮询流等进行流式传输。(我的猜测)
对于本地文件(我实际上找不到本地文件的定义,但我认为它是磁盘上的文件),g_local_file_input_stream_read
我们最终找到了系统调用read
158 行:
static gssize
g_local_file_input_stream_read (GInputStream *stream,
void *buffer,
gsize count,
GCancellable *cancellable,
GError **error)
{
GLocalFileInputStream *file;
gssize res;
file = G_LOCAL_FILE_INPUT_STREAM (stream);
res = -1;
while (1)
{
if (g_cancellable_set_error_if_cancelled (cancellable, error))
break;
res = read (file->priv->fd, buffer, count);
if (res == -1)
{
int errsv = errno;
if (errsv == EINTR)
continue;
g_set_error (error, G_IO_ERROR,
g_io_error_from_errno (errsv),
_("Error reading from file: %s"),
g_strerror (errsv));
}
break;
}
return res;
}
同样地write
称呼在g_local_file_output_stream_write
:
static gssize
g_local_file_output_stream_write (GOutputStream *stream,
const void *buffer,
gsize count,
GCancellable *cancellable,
GError **error)
{
GLocalFileOutputStream *file;
gssize res;
file = G_LOCAL_FILE_OUTPUT_STREAM (stream);
while (1)
{
if (g_cancellable_set_error_if_cancelled (cancellable, error))
return -1;
res = write (file->priv->fd, buffer, count);
if (res == -1)
{
int errsv = errno;
if (errsv == EINTR)
continue;
g_set_error (error, G_IO_ERROR,
g_io_error_from_errno (errsv),
_("Error writing to file: %s"),
g_strerror (errsv));
}
break;
}
return res;
}