Linux下write命令同意用户跟其它终端上的用户对话。用c语言实现shell命令write。代码例如以下:

#include	<stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <utmp.h>
#include <pwd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <time.h> char * get_terminal_name(char *);
char * get_terminal_name_by_user_name(char *);
void hello(); int main(int argc, char * argv[]) {
int fd;
char buffer[1024];
char * terminal_name;
if (argc != 2) {
printf("write usage: write [ttyname|username]");
return 1;
}
terminal_name = get_terminal_name(argv[1]);
if(terminal_name == NULL)
{
printf("get terminal name error\n");
return 1;
}
//printf("terminate_name:%s", terminal_name); fd = open(terminal_name,O_WRONLY);
hello(fd); while(fgets(buffer,1024,stdin) != EOF)
{
write(fd,buffer,strlen(buffer));
}
close(fd);
return 0;
} void hello(int fd) {
char greeting[1024];
struct passwd * passwd_pointer;
time_t now;
char host[255];
gethostname(host, 255);
time(&now);
passwd_pointer = getpwuid(getuid());
sprintf(greeting, "Message from %s@%s on %s at %5.5s ...\n",
passwd_pointer->pw_name, host, ttyname(0), ctime(&now) + 11);
write(fd,greeting,strlen(greeting));
} char * get_terminal_name(char * user_input) {
char terminal_name[255];
struct stat stat_buffer;
if (lstat(user_input, &stat_buffer) != -1) {
if (S_ISCHR(stat_buffer.st_mode)) {
return user_input;
}
}
return get_terminal_name_by_user_name(user_input);
} char * get_terminal_name_by_user_name(char * user_name) {
struct utmp * utmp_pointer;
setutent();
int number = 0;
char * result = (char *) malloc(sizeof(char) * 255);
char *mytty = ttyname(0); /* begins "/dev/" */
char *ttydev = mytty + strlen("/dev/");
printf("%s\n", mytty); while ((utmp_pointer = getutent()) != NULL) {
if (strcmp(user_name, utmp_pointer->ut_user) == 0
&& utmp_pointer->ut_type == USER_PROCESS
&& strcmp(utmp_pointer->ut_line, ttydev) != 0
&& utmp_pointer->ut_line[0] != ':') {
number++;
//printf("%s\n", utmp_pointer->ut_line);
if (number == 1) {
strcpy(result, "/dev/");
strcat(result, utmp_pointer->ut_line);
}
}
}
endutent();
if (number > 1)
printf("warning:%s is logged in %d different terminals,using %s\n",
user_name, number, result);
if(number == 0)
return NULL;
return result;
}

自己动手写shell命令之write的更多相关文章

  1. 自己动手写shell命令之ls -R1fF

    ls命令的R參数代表递归的列出全部子目录中的全部文件,1表示每一行仅仅显示一个文件或目录,f表示不排序即输出.F表示在每项的输出的最后依据其文件类型对应的加上*/=>@|字符.通过c语言实现ls ...

  2. 自己动手写shell命令之more

    unix下more命令的简单实现: #include <stdio.h> #define PAGELEN 24 #define LINELEN 512 int do_more(FILE * ...

  3. 自己动手写shell命令之ls

    linux下ls命令(支持-R參数)的c语言实现: #include <stdio.h> #include <sys/types.h> #include <dirent. ...

  4. 自己动手写ls命令——Java版

    自己动手写ls命令--Java版 介绍 在前面的文章Linux命令系列之ls--原来最简单的ls这么复杂当中,我们仔细的介绍了关于ls命令的使用和输出结果,在本篇文章当中我们用Java代码自己实现ls ...

  5. 自己动手写shell之chgrp,chown,chmod

    1.chgrp实现 #include <grp.h> #include <unistd.h> void chgrp(char * groupname,char * filena ...

  6. 自己写shell命令pwd

    思维:(1)得到"."的i节点号,叫n(使用stat) (2)chdir ..(使用chdir) (3)找到inode号为n的节点,得到其文件名称. 反复上述操作直到当前文件夹&q ...

  7. 写了一个Mac快速设置、打开和关闭Web代理的Shell命令

    缘由(痛点) 每次在Mac上设置Web代理,都需要点开"系统偏好设置 -- 网络 -- 高级 -- 代理",然后分别设置Web代理(HTTP)和安全Web代理(HTTPS),设置完 ...

  8. Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本

    Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本 在 mac 或者 linux 系统中,我们的浏览器或者其他下载软件下载的文件全部都下载再 ~/Downloads/ 文 ...

  9. 自定义shell命令--闪烁的字母(PIL实现)

    之前看到shell命令行,有人写过漫天下字母的cmatrix,想自己动手用python写一个类似,但是比较有自己风格的shell屏保 大致效果如下: 制作这个的大体思路比较简单: 1.利用python ...

随机推荐

  1. “/”应用程序中的server错误

    前几天敲ASP.NET有关验证控件的样例的时候,出现了这个问题: 可是对于这个问题我们应该都不陌生,之前敲牛腩的时候也出现过,当时的解决方法是: 在web.config中找         <a ...

  2. Makefile整理

    Makefile里的subst 用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO Makefile中的字符串处理函数 格式: $(subst <from& ...

  3. Shader Object及Program操作API

    Shader Object及Program操作API Program:  1. GLuint glCreateProgram( void );//创建 2. void glDeleteProgram( ...

  4. Ubuntu Server+openerp

    转自:http://www.2cto.com/os/201212/180118.html 今天主要完成OPENERP部署的第一步,安装Ubuntu Server操作系统: 1.将计算机的BIOS设定成 ...

  5. openerp用wizard导入excel数据

    来自:http://blog.csdn.net/yumingbuzhongyao/article/details/18669183 作为一个quick note吧. OE里的csv导入数据功能形同摆设 ...

  6. Storm简述及集群安装

    Storm 集群类似于一个 Hadoop 集群.然而你在 Hadoop 的执行"MapReduce job", 在storm 上你执行 "topologies (不好翻译 ...

  7. 【J2EE之web应用】java集群概念

    在学习web应用进行部署的时候,遇到一个名词java集群,(事实上遇到非常多名词╭(╯^╰)╮~~~).不懂意思就查一查! 在这里做个笔记! 没有什么高深见解,就搞明确几个概念,java集群的特点 . ...

  8. 解决:Access denied for user ''@'sinochip-79e833' (using password: NO)

    uthentication to host '' for user '' using method 'mysql_native_password' failed with message: Acces ...

  9. git版本库管理介绍,撤销git pull操作

    Git是分布式版本控制系统,GitHub 是最大的 Git 版本库托管商,是成千上万的开发者和项目能够合作进行的中心. 大部分 Git 版本库都托管在 GitHub,很多开源项目使用 GitHub 实 ...

  10. 【转载】MyEclipse使用指南(精简版)

    1.安装 2.注册 3.配置 window ----> preferences (1)配置 JDK java--->Installed JREs --> Add ---> JR ...