• Linux下基于C的简单终端聊天程序


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    /*        编译命令:gcc w2.c -o  w2 
        
     *        使用方法:w2 用户名     
        
     *        权限设置:假设编译后得到可执行文件write1,为了使得任意用户均可使用write1,先设置权限 
        
                         chmod 4755 write1 
        
                      再将write1拷贝到/bin下 
        
                    如果u02登录不止一次,则会向所有u02登录的终端发信息 
        
                    如果u02没有登录,提示错误 
        
                    不会给root登陆的桌面发信息 
        
     */
        
         
        
    #include    <stdio.h> 
        
    #include       <stdio.h> 
        
    #include       <stdlib.h> 
        
         
        
    #include       <string.h> 
        
    #include       <fcntl.h> 
        
    #include       <utmp.h> 
        
         
        
    #define  max_user 10  //最大用户 
        
         
        
    //声明查找终端函数 
        
    void get_tty(char *logname,char tty_for_user[max_user][max_user]); 
        
         
        
    int main( int ac, char *av[] ) 
        
        
           int       fd[max_user]; 
        
           char       buf[BUFSIZ]; 
        
           char       tty_for_user[max_user][max_user]; 
        
        //如果使用 char     *tty_for_user[max_user];则要修改相应的代码,不然运行时可能出现段错误.(原因就是二维数组与指针数组直接分配空间的差异).... 
        
               
        
           int i=0; 
        
           if ( ac != 2 ){   //判断是否输入用户名                                 
        
                  fprintf(stderr,"Message: Please write the logname\n"); 
        
                  exit(1); 
        
           
        
           if(strncmp(av[1],"root",4)==0)//禁止向root发送消息 
        
           
        
                 fprintf(stderr,"ERROR: DON'T WRITE TO ROOT\n"); 
        
                          exit(1); 
        
           
        
           get_tty(av[1],tty_for_user);//根据用户名查找终端名 
        
           if(tty_for_user[0]==NULL ||strlen(tty_for_user[0])==0 )// 
        
           
        
                  printf("Message: The user %s  no login \n ",av[1]); 
        
                  return 0;        
        
           
        
         i=0; 
        
            while(i<max_user) 
        
           {       
        
                  if(strlen(tty_for_user[i])==0 )break
        
                  sprintf(buf, "/dev/%s", tty_for_user[i]); 
        
                  fd[i] = open( buf, O_WRONLY );/*打开设备并且获取相应终端名*/
        
                  if ( fd[i] == -1 ) 
        
                  
        
                         perror(buf); //如果有错就显示错误 
        
                         exit(1); 
        
                  
        
                  i++; 
        
           
        
         
        
           whilefgets(buf, BUFSIZ, stdin) != NULL ) //循环获取用户输入的信息。 
        
           {     i=0; 
        
               while(i<max_user) 
        
                  {       
        
                         if(strlen(tty_for_user[i])==0)break
        
                         //将消息写到相应用户终端屏幕,并判断是否有错误 
        
                         if ( write(fd[i], buf, strlen(buf)) == -1 ) 
        
                                break
        
                         i++; 
        
                  
        
           
        
         
        
           i=0; 
        
           while(i<max_user) 
        
           {       
        
                  if(strlen(tty_for_user[i])==0)break
        
                  close( fd[i]);//关闭 
        
           
        
               
        
           return 1; 
        
        
         
        
         
        
    /* 使用类似who命令根据用户名查找终端名 */
        
    void get_tty(char *logname,char tty_for_user[max_user][max_user] ) 
        
        
           static struct utmp utrec; 
        
           int   utfd; 
        
           int   i=0; 
        
           int   namelen = sizeof( utrec.ut_name ); 
        
           //打开utmp登陆日志 
        
           if ( (utfd = open( UTMP_FILE, O_RDONLY )) == -1 )   
        
           {              
        
                  printf ("Message:No user login \n");     return
        
           
        
           //获取用户名对应的终端名 
        
           while( read( utfd, &utrec, sizeof(utrec)) == sizeof(utrec) ) 
        
           {       
        
                      
        
                  if strncmp(logname, utrec.ut_name, namelen ) == 0 ) 
        
                  {       
        
                         strcpy(tty_for_user[i++],utrec.ut_line);                                                   
        
                  
        
                  if (i==utfd)break
        
           
        
           close(utfd);//关闭 
        

    运行效果截图:

    错误提示:





    本文从百度空间搬家到博客园。

  • 相关阅读:
    你认为做好测试计划工作的关键是什么?
    一套完整的测试应该由哪些阶段组成?
    你对测试最大的兴趣在哪里?为什么?
    如何测试一个纸杯?
    黑盒测试和白盒测试各自的优缺点
    在您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
    测试人员在软件开发过程中的任务
    软件测试分为几个阶段? 各阶段的测试策略和要求是什么?
    软件测试的策略
    软件产品质量特性
  • 原文地址:https://www.cnblogs.com/yunanwu/p/4168564.html
Copyright © 2020-2023  润新知