自己动手写shell命令之write
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的更多相关文章
- 自己动手写shell命令之ls -R1fF
ls命令的R參数代表递归的列出全部子目录中的全部文件,1表示每一行仅仅显示一个文件或目录,f表示不排序即输出.F表示在每项的输出的最后依据其文件类型对应的加上*/=>@|字符.通过c语言实现ls ...
- 自己动手写shell命令之more
unix下more命令的简单实现: #include <stdio.h> #define PAGELEN 24 #define LINELEN 512 int do_more(FILE * ...
- 自己动手写shell命令之ls
linux下ls命令(支持-R參数)的c语言实现: #include <stdio.h> #include <sys/types.h> #include <dirent. ...
- 自己动手写ls命令——Java版
自己动手写ls命令--Java版 介绍 在前面的文章Linux命令系列之ls--原来最简单的ls这么复杂当中,我们仔细的介绍了关于ls命令的使用和输出结果,在本篇文章当中我们用Java代码自己实现ls ...
- 自己动手写shell之chgrp,chown,chmod
1.chgrp实现 #include <grp.h> #include <unistd.h> void chgrp(char * groupname,char * filena ...
- 自己写shell命令pwd
思维:(1)得到"."的i节点号,叫n(使用stat) (2)chdir ..(使用chdir) (3)找到inode号为n的节点,得到其文件名称. 反复上述操作直到当前文件夹&q ...
- 写了一个Mac快速设置、打开和关闭Web代理的Shell命令
缘由(痛点) 每次在Mac上设置Web代理,都需要点开"系统偏好设置 -- 网络 -- 高级 -- 代理",然后分别设置Web代理(HTTP)和安全Web代理(HTTPS),设置完 ...
- Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本
Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本 在 mac 或者 linux 系统中,我们的浏览器或者其他下载软件下载的文件全部都下载再 ~/Downloads/ 文 ...
- 自定义shell命令--闪烁的字母(PIL实现)
之前看到shell命令行,有人写过漫天下字母的cmatrix,想自己动手用python写一个类似,但是比较有自己风格的shell屏保 大致效果如下: 制作这个的大体思路比较简单: 1.利用python ...
随机推荐
- 九度OJ 1006 ZOJ问题 (这题測试数据有问题)
题目1006:ZOJ问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:15725 解决:2647 题目描写叙述: 对给定的字符串(仅仅包括'z','o','j'三种字符),推断他能否AC ...
- 安装--->Tomcat监控工具Probe
1.Porbe介绍 psi-probe用于对Tomcat进行监控,比tomcat的manager强大很多. 2.下载 probe-2.3.3.zip 或者 probe.war 3.将下载好的war ...
- 如何使用屏幕取色工具ColorPixl
ColorPix可以屏幕取色,假如现在想要取色桌面徽标键的颜色,按任意键可以锁定这个区域(press any key to lock)这样我们就可以在放大的区域更清楚的取色,加号按钮可以设置该软件是否 ...
- Discuz常见小问题-如何修改favourite图标
1做好一个ico图标之后,直接替换目录下的对应文件即可, 如果没效果刷新浏览器或更新后台CSS缓存.
- redis可视化管理工具Redis Desktop Manager
Redis Desktop Manager 官方下载地址:https://redisdesktop.com/download
- 飘逸的python - 使用reload进行热更新
一开始我们的游戏商城配置是从txt读取解析的. 后来为了方便运营修改配置,改成从数据库读取并提供后台可视化编辑配置. 如果为了使配置生效而重启游戏进程那太麻烦了. 这时候reload就派上用途了. 下 ...
- Electron 调用系统Office软件
通过打开本地空白文件的方式从而打开Office办公软件 const shell = require('electron').shell; const path = require('path'); s ...
- PyQt5教程——组件(7)
PyQt5中的组件(widgets) 组件(widgets)是构建一个应用的基础模块.PyQt5有广泛的各式各样的组件,包含按钮,复选按钮,滑块条,和列表框.在这个部分的教程中,我们将学习几种有用的组 ...
- Redis学习(4)-数据类型,string,hash
Redis数据类型: redis使用键值对保存数据 key:全部是字符串 value:五种数据类型:string,hash,List,Set,有序的Set集合. key命名:自定义,名字不要过长,否则 ...
- linux limits.conf 配置
转自:http://kerry.blog.51cto.com/172631/300784 limits.conf 文件实际是 Linux PAM(插入式认证模块,Pluggable Authentic ...