Tag: fcntl

如何检查文件是否被锁定?

我有以下代码,我想检查文件是否被锁定。 如果没有,那么我想写信给它。 我通过在两个终端上同时运行它来运行此代码但是我每次都在两个选项卡中都处于“锁定”状态,即使我没有锁定它。 代码如下: #include #include #include int main() { struct flock fl,fl2; int fd; fl.l_type = F_WRLCK; /* read/write lock */ fl.l_whence = SEEK_SET; /* beginning of file */ fl.l_start = 0; /* offset from l_whence */ fl.l_len = 0; /* length, 0 = to EOF */ fl.l_pid = getpid(); /* PID */ fd […]

O_NONBLOCK是否设置了文件描述符或基础文件的属性?

从我在Open Group网站上read fcntl , open , read和write ,我得到的印象是O_NONBLOCK是否设置在文件描述符上,因此非阻塞I / O是否与描述符一起使用,应该是该文件描述符的属性而不是底层文件。 例如,作为文件描述符的属性意味着,如果我复制文件描述符或打开另一个描述符到同一文件,那么我可以使用阻塞I / O和一个非阻塞I / O与另一个。 然而,尝试使用FIFO,似乎不可能同时为FIFO提供阻塞I / O描述符和非阻塞I / O描述符(因此,是否设置O_NONBLOCK是基础文件的属性[FIFO] ]): #include #include #include #include #include int main(int argc, char **argv) { int fds[2]; if (pipe(fds) == -1) { fprintf(stderr, “`pipe` failed.\n”); return EXIT_FAILURE; } int fd0_dup = dup(fds[0]); if (fd0_dup <= STDERR_FILENO) { fprintf(stderr, […]

是否可以(并且安全)使接受套接字无阻塞?

我正在寻找一种方法来中断阻塞套接字上的accept()调用。 使用信号不是一种选择,因为这意味着在库中,我不想混淆用户信号。 使用select()是另一种选择,因为各种原因buf在我的情况下不是很吸引人。 如果可能,最好的方法是将套接字设置为非阻塞模式(使用fcntl()和O_NONBLOCK )来自另一个线程,而套接字在accept()调用时被阻塞。 预期的行为是accept()调用将在errno使用EAGAIN或EWOULDBLOCK返回。 它真的会这样吗? 安全吗? 便携式? 如果你知道这个方法对Windows的适用性(你需要使用WSAIoctl()和FONBIO ),我也很感兴趣。