C使用写入(2)检查fd是否打开

C使用写入(2)检查fd是否打开,c,file-descriptor,errno,C,File Descriptor,Errno,是否可以通过系统调用write2知道我向其发送数据的fd是打开还是关闭的 我的问题是,我正在给一个fd写信,这个fd有时关闭,有时打开。我想一定有办法知道写这种情况,但我找不到。你可以使用一个系统函数,它在打开时不会影响文件,而不是写,使用fstat 范例 struct stat buf; if (fstat(fd, &buf) == -1) { // fd is either closed or not accessible } 如果无法使用文件描述符0,则fstat返回-

是否可以通过系统调用write2知道我向其发送数据的fd是打开还是关闭的


我的问题是,我正在给一个fd写信,这个fd有时关闭,有时打开。我想一定有办法知道写这种情况,但我找不到。

你可以使用一个系统函数,它在打开时不会影响文件,而不是写,使用fstat

范例

struct stat buf;
if (fstat(fd, &buf) == -1) {
    // fd is either closed or not accessible 
}

如果无法使用文件描述符0,则fstat返回-1。

如果打开文件,则可以使用不影响文件的系统函数,而不是使用fstat进行写入

范例

struct stat buf;
if (fstat(fd, &buf) == -1) {
    // fd is either closed or not accessible 
}
如果无法使用文件描述符0,则fstat返回-1。

来自

成功时,返回写入的字节数为零 什么也没写。出现错误时,返回-1,并设置errno 适当地

因此,只需从

成功时,返回写入的字节数为零 什么也没写。出现错误时,返回-1,并设置errno 适当地


因此,只需检查-1的返回值,write2有返回值。为什么您的代码试图写入一个已经关闭的文件描述符?除非这是一个连接被远程端点关闭的套接字,否则如果您有试图写入句柄的代码,则它会与程序中的错误对话,而该代码可能已在程序中的其他地方关闭。还是我遗漏了什么?@selbie套接字在连接关闭时不会关闭,所以没有例外。我的问题是,我正在向fd写入数据,fd有时关闭,有时打开。不,您的程序设计有问题。只需跟踪fd的状态即可。@soissy您的fd始终有效,无论客户端进程是否终止。如果写入阻塞了您,那么客户端进程并没有死,或者有另一个fd引用同一对象,可能是您的进程服务器?。在forking.write2具有返回值后,您可能忘记关闭它。为什么您的代码试图写入已关闭的文件描述符?除非这是一个连接被远程端点关闭的套接字,否则如果您有试图写入句柄的代码,则它会与程序中的错误对话,而该代码可能已在程序中的其他地方关闭。还是我遗漏了什么?@selbie套接字在连接关闭时不会关闭,所以没有例外。我的问题是,我正在向fd写入数据,fd有时关闭,有时打开。不,您的程序设计有问题。只需跟踪fd的状态即可。@soissy您的fd始终有效,无论客户端进程是否终止。如果写入阻塞了您,那么客户端进程并没有死,或者有另一个fd引用同一对象,可能是您的进程服务器?。你可能在分叉后忘了关上它。