如果_POSIX_VDISABLE值为-1怎么办?

时间:2010-05-23 10:56:21

标签: posix

在POSIX _POSIX_VDISABLE值中,如果为-1,则所有终端设备文件的特殊字符都没有禁用字符;否则该值是禁用字符值..

请任何人帮助我理解这一点。我无法得到这个的确切含义。

2 个答案:

答案 0 :(得分:3)

如果查看definition of special characters,那应该是(thre'-1'值),所有这些特殊字符都是活动的:

  

在规范输入中,终端驱动程序识别出许多执行各种控制功能的特殊字符   其中包括用于编辑输入的ERASE字符(通常为 DEL )以及其他编辑字符。
  用于发送SIGINT信号的INTR字符(通常为 Ctrl - c )以及其他信号提升字符可以在规范或非规范输入模式下使用

你有很多这些特殊的角色:


已经提出了一个问题,看看1997年是否such a value was portable(总是编译):

  

第2.9.4节中的措辞:

     

如果表2-11中的任何常量被定义为在头文件中具有值-1

     

可以在随意阅读时建议使用以下代码来最小化尺寸   并优化每个实施的效率:

#ifdef _POSIX_VDISABLE
#if    _POSIX_VDISABLE == -1
    /* code that assumes no vdisable capability */
#else
    /* code that assumes vdisable capability */
#endif
#else
    /* code that uses pathconf() to determine vdisable capability */
#endif

interpretation #34暗示它会。

  

通过在COMPILE-TIME使用这些值,便携式POSIX.1应用程序可以避免在定义符号时加载与表2-11中的符号关联的所有pathconf()相关代码。

答案 1 :(得分:2)

我的终端有特殊键,比如^ C来中断,^ \来转储核心,^ W来擦除一个字,^ U来擦除一行。 xterm和其他终端仿真器中存在特殊密钥,但它们在每个终端中都不相同。 POSIX应用程序可以在< termios.h>中调用tcgetattr()或tcsetattr()。获取或设置这些特殊键。他们还可以禁用某些键,例如:

tcgetattr(fd, tp);
tp->c_lflag &= ~ISIG;                /* disable all the signal keys */
tp->c_cc[WERASE] = _POSIX_VDISABLE;  /* disable the word-erase key */
tcsetattr(fd, tp);

在POSIX.1-2001之前,对_POSIX_VDISABLE的支持是可选的。有三种可能性:

  • _POSIX_VDISABLE已定义,而不是-1。然后任何终端都可以使用_POSIX_VDISABLE来禁用特殊密钥。
  • _POSIX_VDISABLE已定义且为-1。那么没有终端可以使用_POSIX_VDISABLE。
  • _POSIX_VDISABLE未定义。然后,为每个终端禁用特殊密钥的值可能不同。像pathconf("/dev/tty", _PC_VDISABLE)这样的调用会返回该终端的值,如果该终端没有值来禁用特殊键,则返回-1。

当系统添加< termios.h>时,所有或几乎所有系统都定义_POSIX_VDISABLE而不是-1。我查看了the Unix tree中的一些旧系统。所有Minix 1.5(1989),Linux 0.96c(1992)和4.4BSD(1993)都定义了_POSIX_VDISABLE而不是-1。 (在POSIX之前,< termios.h>不存在,并且系统使用另一个标头,例如< sgtty.h>来配置终端。)

POSIX-1.2001只需要定义_POSIX_VDISABLE而不是-1。 POSIX.1-2001 said for <unistd.h>

  

_POSIX_VDISABLE

     
    

该符号应定义为一个字符的值,该字符将禁用<termios.h>中描述的终端特殊字符处理。此符号应始终设置为-1以外的值。

  

The rationale says

  

作为修订版的一部分,在POSIX.1-1990标准上使用FIPS 151-2配置文件的选项已经发生了一些调整。现在必须使用POSIX.1-1990标准中的以下选项:

     
      
  • _POSIX_JOB_CONTROL
  •   
  • _POSIX_SAVED_IDS
  •   
  • _POSIX_VDISABLE
  •