當代理功能fcntl
stdin
,當我設置stdin
FD狀態標誌爲O_NONBLOCK
時,我遇到了一個問題,它工作正常,但副作用。 stdout和stderr的狀態標誌也已更改爲O_NONBLOCK
。Linux C,爲什麼fcntl在STDIN上運行也會影響STDOUT和STDERR?
我調查的功能fcntl
,SYSCALL_DEFINE3
和do_fcntl
的源代碼,但沒有什麼幫助。還stackoverflow或谷歌。我認爲它可能與內核或glibc實現有關。
我的電腦是x86_64上的Ubuntu 12.04,安裝了gcc 4.6.3。
int flag = 0;
int value = O_NONBLOCK;
int fd = open("./tmp", O_RDONLY);
if(-1 == (flag = fcntl(fd, F_GETFL)))
fprintf(stdout, "%d:%s\n", errno, strerror(errno));
flag = fcntl(stdin->_fileno, F_GETFL);
flag = fcntl(stderr->_fileno, F_GETFL);
if(-1 == (flag = fcntl(stdout->_fileno, F_GETFL)))
fprintf(stdout, "%d:%s\n", errno, strerror(errno));
flag = fcntl(stdout->_fileno, F_SETFL, flag | O_NONBLOCK);
flag = fcntl(fd, F_GETFL);
flag = fcntl(stdin->_fileno, F_GETFL);
flag = fcntl(stdout->_fileno, F_GETFL);
flag = fcntl(stderr->_fileno, F_GETFL);
flag = fcntl(stdin->_fileno, F_SETFL, flag | O_APPEND);
flag = fcntl(fd, F_GETFL);
flag = fcntl(stdin->_fileno, F_GETFL);
flag = fcntl(stdout->_fileno, F_GETFL);
flag = fcntl(stderr->_fileno, F_GETFL);
close(fd);
這是我對這個問題的代碼。
如何發佈一些代碼? –
您是否嘗試過不使用tty(例如'echo「| |。/ your_program')? – SheetJS
是的。謝謝!我只是'gdb a.out',並顯示標誌,當設置O_NONBLOCK爲stdout時,我得到的stdin和stderr都有O_NONBLOCK。它很困惑。〜 –