切换其他';s允许写入您的终端[Unix][C]

切换其他';s允许写入您的终端[Unix][C],c,unix,terminal,tty,C,Unix,Terminal,Tty,我正在开发一个流程,允许用户允许或禁止他人向其终端写入数据。下面是我所拥有的,但它似乎不起作用,我不知道为什么。如果有人能给我指出正确的方向,我将不胜感激 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> main( int ac, char *av[] ){ struct

我正在开发一个流程,允许用户允许或禁止他人向其终端写入数据。下面是我所拥有的,但它似乎不起作用,我不知道为什么。如果有人能给我指出正确的方向,我将不胜感激

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>

main( int ac, char *av[] ){
  struct stat settings;
  int perms;

  if ( fstat(0, &settings) == -1 ){
    perror("Cannot stat stdin");
    exit(0);
  }

  perms = (settings.st_mode & 07777);

  if ( ac == 1 ){
    printf("Other's write is %s\n", (perms & S_IWOTH)?"On":"Off");
    exit(0);
  }

  if ( ac == 2 && av[1][0] == 'n' )
    perms &= ~S_IWOTH;
  else
    perms &= S_IWOTH;
  fchmod(0, perms);
  return 0;
}
#包括
#包括
#包括
#包括
#包括
main(int ac,char*av[]){
结构统计设置;
int-perms;
如果(fstat(0,&设置)=-1){
perror(“无法统计标准数据”);
出口(0);
}
perms=(settings.st_mode&07777);
如果(ac==1){
printf(“其他写入为%s\n”,(perms&s_IWOTH)?“开”:“关”);
出口(0);
}
如果(ac==2&&av[1][0]==n')
perms&=~S_IWOTH;
其他的
perms&=S_IWOTH;
fchmod(0,perms);
返回0;
}

你可能是有意的

perms |= S_IWOTH;
而不是

perms &= S_IWOTH;
&
'ing with
S_IWOTH
将清除所有不是
S_IWOTH
的位,如果该位尚未设置,则该位也将保留为零

您可以运行
tty(1)
获取终端的文件名,并在其上运行
ls-l
查看权限,以防您还不知道。不要忘记,组权限可能也很重要


检查
fchmod(2)
的返回值也是一个好主意。

看看
man 1 mesg
啊,对了,我完全下了个决心,不要用按位或代替and来切换,但我忘了。谢谢你,伙计!此外,你不会碰巧知道如何仅从他们的用户名中获取其他用途的终端设备文件,对吗?@Mikotto:
谁| grep
应该工作。一种黑客手动方式是在
/dev/pts/
中检查文件所有者。另外请注意Alnitak的评论,除非您只是为了学习。已经有一个util可以做完全相同的事情。@Mikotto实际上,找到其他用户TTY的标准方法是通过
utmp
函数。@Alnitak是的,我只是打开了utmp并获得了一个新条目,直到输入的用户名等于当前条目的名称,然后从中获得终端。谢谢你,