linux下简易实现write命令及相应权限位设置

/*
    write用于登录到几台主机上两个用户直接进行通信
    mesg  y/n 用于设置是否接收write的消息
    格式:write username terminal-line
    例如:write 123 tty1    
                write 123 /dev/tty1  此时制定用户与终端进行通信
                write 123 此时程序访问utmp文件,获得获取登录的用户名为123的终端,若终端为多个,则向访问到的最后一个终端发信
    输入EOF字符,终止进程
    
*/
#include <stdio.h>
#include <string.h>
#include <utmp.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#define NUMNAME 30     // 存放终端名的长度
#define NUMMES 50         //接受消息缓冲区的长度
int main(int argc, char* argv[])
{
    char name[NUMNAME]= "";                 //存放用户名
    char writeto[NUMNAME] = "/dev/";     //存放终端名
    struct utmp buf;
    int fd;
    int num, num_utmp, ch;
    char mes[NUMMES];
    num = 0;
    if (argc == 1) {
        fprintf(stderr, "usage: write user [tty]");
        exit(1);
    }
    strcpy(name, argv[1]);
    if (argc == 3) {
    //兼容/dev/tty1 和tty1两种参数模式,做兼容处理
        if (!strncmp(argv[2], writeto, 5))
            strcat(writeto, &argv[2][5]);
        else
            strcat(writeto, argv[2]);
        num++;
    }
    else {
    //遍历utmp文件,获得此时登录机器的用户及终端
        if ((fd = open("/var/run/utmp", O_RDONLY)) == -1) {
            perror("open error");
            exit(1);
        }
        num_utmp = sizeof(struct utmp);
        while (read(fd, &buf, num_utmp) == num_utmp) {
            if (!strcmp (buf.ut_user, name)&&strcmp(buf.ut_line, ":0")) {
                if (num > 0) 
                    writeto[5] = ‘\0‘;
                strcat(writeto, buf.ut_line);
                num++;
            }
        }
        close(fd);
    }
    //最后writeto参数均为/dev/tty 种形式
    if (num == 0){
        fprintf(stderr, "no destination:%s\n", name);
        exit(0);
    }
    if (num >1) 
        fprintf(stdout, "more then 1 tty, chose: %s\n", writeto);
        
    if ((fd = open(writeto, O_WRONLY)) == -1) {
        perror("open error");
        exit(1);
    }
    /*
        为相应接受到EOF字符,终止进程,采用getc函数,按字节接收字符,通过write函数,按行写入到目的终端
        若接收‘\n‘ 或EOF,则write一次。EOF同时终止程序
        */
    while (1) {
        for (num =0;num < NUMMES ;num++) {
            ch=getc(stdin);
            mes[num] = ch;
            if (ch == ‘\n‘ || ch == EOF)
                break;
        }
        if (ch == EOF) {
            if (num != 0)
                mes[num++] = ‘\n‘;
            mes[num] = ‘E‘;
            mes[++num] = ‘O‘;
            mes[++num] = ‘F‘;
            mes[++num] = ‘\0‘;
        }
        if (write(fd, mes, num+1) != (num+1)) {
            perror("write error");
            exit(1);
        }
        if (ch == EOF)
            break;
    }    
}

执行文件需要设置权限位,才能和系统提供的write命令,运行结果完全一致。否则,在是否有写权限的问题上存在偏差。

依次执行命令:chown root write 用户ID设置为root

chgrp tty write     组ID设置为tty

chmod g+s write 组权限设置set-group-ID位

总结:

1、设置权限位,否则程序运行起来与系统wirte命令结果有较大出入。

chmod g+s write 组权限设置set-group-ID位,非常重要

2、字符串如果越界会出现非常奇怪的错误,且很难察觉,所以字符一定预留足够的长度。此处浪费大量时间。

时间: 2025-01-31 03:01:58

linux下简易实现write命令及相应权限位设置的相关文章

linux下简易搭建svnserver

参考文档: 安装部署: http://www.cnblogs.com/wrmfw/archive/2011/09/08/2170465.html http://www.ha97.com/4467.html 关闭服务: http://linux.chinaunix.net/techdoc/net/2005/08/17/923721.shtml 测试成功: http://blog.163.com/[email protected]/blog/static/1736123482012021142129

linux下oralcle11g使用edit命令默认调用vi编辑器

linux下oralcle11g使用edit命令默认调用vi编辑器: 在        $ORACLE_HOME/sqlplus/admin/glogin.sql   最后一行添加   define_editor=vi  即可. linux下oralcle11g使用edit命令默认调用vi编辑器,布布扣,bubuko.com

Linux下静态路由配置命令

linux下静态路由修改命令 方法一: 添加路由 route add -net 192.168.1.0/24 gw 192.168.1.1 route add -host 192.168.1.8 dev 192.168.1.1 删除路由 route del -net 192.168.0.0/24 gw 192.168.0.1 add 增加路由 del 删除路由 -net 设置到某个网段的路由 -host 设置到某台主机的路由 gw 出口网关 IP地址 dev 出口网关 物理设备名 增加默认路由

Linux下那些奇葩的命令

相信喜爱编程,痴迷技术的你,肯定接触过甚至深爱着linux,甚至可能已经非常熟悉linux了,但是linux那逗比的一面,你又知道多少. 本文!纯粹娱乐!不喜勿喷! 1.程序员的愤怒! yes 当我们再终端输入yes命令,你就回看到愤怒地y怒刷屏! 2.小火车sl 我相信ls你每天输入无数次,但是sl你又知道不知道? 我们需要安装一下 sudo yum install sl ubuntu用户: sudo apt-get install sl 之后,再输入sl命令,哈哈,看到小火车没有! 3.无聊

实现Linux下的ls -l命令

基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: 1 /************************************************************************* 2 > File Name: dirwalk.c 3 > Author: 4 > Mail: 5 > Created Time: Tue 31 Mar 2015 11:56:38 AM CST 6 ******************

linux下的性能查询命令

(1)查看各个CPU核的使用情况 sudo top -d 1 进入之后,按1,会出现下面的CPU使用情况,其中us列反映了各个CPU核的使用情况,百分比大说明该核在进行紧张的任务. (2)查看哪个进程在哪个CPU核上运行 sudo top -d 1 进入之后,依次按f.j和空格,会出现如下(其中P列指示的是该进程最近使用的CPU核,如进程mencoder的P列为7,则表示mencoder最近在核7上运行,对于多线程甚至单线程的进程,在不同时刻会使用不同的CPU Core): (3)vmstat查

Linux下的目录创建命令使用实践

[文章摘要] 本文以实际的C源程序为例子,介绍了Linux下的目录创建命令(mkdir)的使用方法,为相关开发工作的开展提供了有益的参考. [关键词] C语言  Linux  目录创建  makefile  开发 一.mkdir命令简介 mkdir命令用来创建指定名称的目录,其命令格式为:mkdir [选项] 目录... 其中,[选项]可以是"-m"."-p"或"-v".此外,目录名是区分大小写的. 二.本程序流程 本文中的程序用于实现创建目录的

Linux下vi替换字符命令操作实例

在Linux下的开发中,经常涉及到对文件里的字符进行处理,当中,对字符的替换操作也是非常的频繁. 本文以一个实际的文件为例,具体介绍了Linux下经常使用的vi替换字符命令,为相关的开发工作提供给了參考. 本文中被操作的文件为TestFile.txt,当中的内容例如以下: [email protected]:~/zhouzx/Test> cat TestFile.txt 12345678907890 ABCDABCDEFGHIJ 12345^&*()() 98765432103210 abc

二十七、Linux下常用的shell命令记录

本文章记录我在linux系统下常用或有用的系统级命令,包括软硬件查看.修改命令,有CPU.内存.硬盘.网络.系统管理等命令.但本文不打算介绍生僻命令,也不介绍各个linux发行版下的特有命令,且以后会持续更新. 说明,我是在一个Centos 6.4 64位的虚拟机系统进行测试.本文介绍的命令都会在此Centos下运行验证(也有部分命令会在我的suse/ubuntu系统里测试的,会做特明说明),但运行结果就不再列出了. 硬件篇 CPU相关 lscpu #查看的是cpu的统计信息. cat /pro