나는 filedescriptor 플래그를 설정하고 가져 오는 데 fcntl(fd, F_SETFD, flg)
및 flg = fcntl(fd, F_GETFD, flg)
을 사용할 수 있다는 인상을 받았습니다.리눅스에서 FD 플래그 설정
https://community.spiceworks.com/linux/man/2/fcntl에 따르면 linux는 일부 fd 플래그 설정 만 지원해야합니다. 공정하다. 그러나 는의 출력에 의해 판단 :
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#define XSZ(x) (int)(sizeof(x)*2)
int main(int argc, char** argv){
int fd, flg;
if ((fd = open("/dev/stdout", O_RDWR)) < 0){ perror("open"); return -errno; }
//get
if ((flg = fcntl(fd, F_GETFD)) < 0){ perror("setfd"); return -errno; }
printf("flg=0x%0*x\n", XSZ(flg), flg);
#define ADD_FLAG(FLG) \
flg |= FLG;\
printf("setting flg=0x%0*x\n", XSZ(flg), flg);\
if ((flg = fcntl(fd, F_SETFD, flg))){ perror("setfd"); return -errno; }\
if ((flg = fcntl(fd, F_GETFD, flg)) < 0){ perror("getfd"); return -errno; }\
printf("flg=0x%0*x\n\n", XSZ(flg), flg);
ADD_FLAG(FD_CLOEXEC);
ADD_FLAG(O_APPEND);
ADD_FLAG(O_DIRECT);
ADD_FLAG(O_ASYNC);
ADD_FLAG(O_NOATIME);
return 0;
}
유일한 설정 가능 플래그가 FD_CLOEXEC
입니다처럼 보이는
flg=0x00000000
setting flg=0x00000001
flg=0x00000001
setting flg=0x00000401
flg=0x00000001
setting flg=0x00004001
flg=0x00000001
setting flg=0x00002001
flg=0x00000001
setting flg=0x00040001
flg=0x00000001
서비스를 제공합니다. (이상한 점 : 모든 전화는 번을 성공적으로 반환합니다.).
https://github.com/torvalds/linux/blob/master/fs/fcntl.c#L259
여기 무슨 일이야 :
그리고 커널처럼 나에게 보이는 거의 F_SETFD
의 인자를 무시? 내가 놓친 게 있니?