1、获取文件的flags,即open函数的第二个参数:
flags = fcntl(fd,F_GETFL,0);
2、设置文件的flags:
fcntl(fd,F_SETFL,flags);
3、增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞:
flags = fcntl(fd,F_GETFL,0);
flags |= O_NONBLOCK;
fcntl(fd,F_SETFL,flags);
4、取消文件的某个flags,比如文件是非阻塞的,想设置成为阻塞:
flags = fcntl(fd,F_GETFL,0);
flags &= ~O_NONBLOCK;
fcntl(fd,F_SETFL,flags);
获取和设置文件flags举例:
#include <error.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char buf[500];
int main(int argc, char* argv[])
{
int ntowrite, nwrite;
const char* ptr;
int flags;
ntowrite = read(STDIN_FILENO, buf, sizeof(buf));
if (ntowrite < 0) {
perror("read STDIN_FILENO fail:");
exit(1);
}
// fprintf(stderr, "read %d bytes\n", ntowrite);
printf("### read %d bytes\n", ntowrite);
if ((flags = fcntl(STDOUT_FILENO, F_GETFL, 0)) == -1) {
perror("fcntl F_GETFL fail:");
exit(1);
}
flags |= O_NONBLOCK;
if (fcntl(STDOUT_FILENO, F_SETFL, flags) == -1) {
perror("fcntl F_SETFL fail:");
exit(1);
}
ptr = buf;
while (ntowrite > 0) {
nwrite = write(STDOUT_FILENO, ptr, ntowrite);
if (nwrite == -1) { perror("write file fail:"); }
if (nwrite > 0) {
ptr += nwrite;
ntowrite -= nwrite;
}
}
flags &= ~O_NONBLOCK;
if (fcntl(STDOUT_FILENO, F_SETFL, flags) == -1) {
perror("fcntl F_SETFL fail2:");
}
}