isatty(STDIN_FILENO)详解

本文介绍了isatty()函数的实现原理及其应用场景,该函数用于判断指定的文件描述符是否指向一个终端设备。此外,还解释了标准输入文件描述符STDIN_FILENO的概念及其在POSIX系统中的作用。
部署运行你感兴趣的模型镜像

关于函数 isatty( )

#include <unistd.h>
int isatty(int filedes);
返回值:若为终端设备则返回1(真),否则返回0(假)

如下程序,isatty函数的实现只使用了一个终端专用的函数 tcgetattr (如果成功执行,它不改变任何东西),并取其返回值。
#include <termios.h>
int isatty(int fd)
{
struct termios ts;
return(tcgetattr(fd,&ts) != -1); /*如果不出错为真(是一个终端设备)*/
}

关于STDIN_FILENO

对 一个进程预定义了三个流,并且这三个流可以自动地被进程使用,它们是:标准输入、标准输出和标准出错。UNIX系统shell使用文件描述符0与进程的标 准输入相关联,文件描述符1与标准输出相关联,文件描述符2与标准出错相关联。这是各种shell以及很多应用程序使用的惯例,而与UNIX内核无关。尽 管如此,如果不遵照这种惯例,那么很多UNIX系统应用程序就不能正常工作。
在依从POSIX的应用程序中,幻数0、1、2应当替换成符号常量STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。这些常量都定义在头文件<unistd.h>中。

关于IEEE POSIX

POSIX 是一系列有IEEE(Institute of Electrical and Electronics Engineers,电气与电子工程师协会)制定的标准。POSIX指的是可移植的操作系统接口(Portable Operating System Interface)。它原来指的只是IEEE标准1003.1-1998(操作系统接口),后来则扩展成包括很多标记为1003的标准及标准草案,包括 shell和实用程序(1003.2
)。


您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

以下是client的程序,在关机重启之后client出现重复输出stdin字符的问题,是什么原因 static void *fcwli_epollRW(void * arg) { int slave_sock = (int)(long) arg; /* 注意不同系统中的区别 */ char serial; int readLen; char buffer[1024*100]; int i; int nfds; int unit = 0; // epoll int epoll_fd = epoll_create1(0); if (epoll_fd < 0) { DBG_ZSZ("epoll_create1"); close(slave_sock); cli__stopUseFakeConsole(); return NULL; } master_info.epoll_fd = epoll_fd; /* 传输unit 号 */ unit = UNIT_CURRENT; if(write(slave_sock,(char*)&unit,sizeof(unit)) < 0) { DBG_ZSZ("write unitId error"); goto done; } struct epoll_event ev, events[2]; // 添加标准输入监控 ev.events = EPOLLIN; ev.data.fd = STDIN_FILENO; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, STDIN_FILENO, &ev) < 0) { DBG_ZSZ("epoll_ctl stdin"); goto done; } // 添加套接字监控(包含断开检测) ev.events = EPOLLIN | EPOLLRDHUP; /* 监控套接字 EPOLLIN | EPOLLRDHUP 状态*/ ev.data.fd = slave_sock; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, slave_sock, &ev) < 0) { DBG_ZSZ("epoll_ctl sock"); goto done; } DBG_ALZ("epoll loop start"); DBG_ZSZ("fwcli__useMasterCliServer------sockfd:%d",slave_sock); // 主事件循环 while (1) { nfds = epoll_wait(epoll_fd, events, 2, 100); // 100ms 超时 // 检查退出标志 pal_mutex_take(mtx_fakeConsole, pal_mutex_FOREVER); if(FALSE == bUseFakeConsole) /* 每次循环都检查bUseFakeConsol的值,如果为False那么线程结束,tFakeConsole结束*/ { printf("FALSE\n"); pal_mutex_give(mtx_fakeConsole);/* 停止使用fakeConsole*/ break; /* 立即结束监听 */ } pal_mutex_give(mtx_fakeConsole); if (nfds < 0) { DBG_ALZ("epoll_wait eroor"); break; } for (i = 0; i < nfds; i++) { if ( STDIN_FILENO == events[i].data.fd) { /* 处理标准输入 */ if (read(STDIN_FILENO, &serial, 1) < 0) { DBG_ALZ("stdin read error"); goto done; } DBG_ZSZ_FILE("/tmp/input.txt","input: %c",serial); pal_mutex_take(mtx_slaveSendInput, pal_mutex_FOREVER); if (write(slave_sock, &serial, 1) < 0) { pal_mutex_give(mtx_slaveSendInput); goto done; } pal_mutex_give(mtx_slaveSendInput); } else if (slave_sock == events[i].data.fd) { /* 处理服务器关闭 */ if (events[i].events & EPOLLRDHUP) { DBG_ALZ("Master closed connection"); goto done; } /* 处理服务器数据 */ readLen = read(slave_sock, buffer, sizeof(buffer)); if (readLen <= 0) { if (readLen < 0) DBG_ALZ("read 失败"); goto done; } write(STDOUT_FILENO, buffer, readLen); } } } done: DBG_ALZ("epoll loop end"); DBG_ZSZ_FILE("/tmp/close.txt","close(epoll_fd) %d",epoll_fd); DBG_ZSZ_FILE("/tmp/close.txt","close(slave_sock) %d",slave_sock); cli__stopUseFakeConsole(); close(epoll_fd); close(slave_sock); return NULL; }
最新发布
10-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值