自己动手写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 ...
随机推荐
- 《linux 内核全然剖析》 sys.c 代码分析
sys.c 代码分析 setregid /* * This is done BSD-style, with no consideration of the saved gid, except * th ...
- 《Java程序设计》第16周周四:GUI编程及文件对话框的使用
第一部分:实验项目 项目一:文件及选择 目的:了解文件对话框的用法,熟悉GUI中事件驱动的核心步骤. 1. 阅读博文 "JFileChooser (Java Swing提供的文件选择对话框 ...
- JAVA中MD5加密实现
MD5加密实现 结 package com.pb; import java.io.UnsupportedEncodingException; import java.security.Message ...
- 应用程序正常初始化(0xc0000135)失败的解决方法
转自:http://blog.sina.com.cn/s/blog_64fba4e00100mzf9.html 这是由于没有安装.NET framework 所造成的,请安装.NET framewor ...
- BZOJ 1040 ZJOI 2008 骑士 基环树林+树形DP
题目大意:有一些骑士.他们每个人都有一个权值.可是因为一些问题,每个骑士都特别讨厌还有一个骑士.所以不能把他们安排在一起.求这些骑士所组成的编队的最大权值和是多少. 思路:首先貌似是有向图的样子,可是 ...
- 〖Linux〗Ubuntu 64位安装sqlite3_analyzer
1. 安装过程 -dev:i386 wget -c "http://www.sqlite.org/2013/sqlite-analyzer-linux-x86-3080200.zip&quo ...
- jquery之往一个CSS属性里写入多个值
<html> <head> <title>test</title> <base href="<%=basePath%>&qu ...
- HTTP 协议中的 Transfer-Encoding
HTTP 协议中的 Transfer-Encoding 文章目录 Persistent Connection Content-Length Transfer-Encoding: chunked 本文作 ...
- C++开发安卓、windows下搭建Android NDK开发环境
1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个 ...
- PHP中的一些安全配置
PHP中的配置至关重要,包含php.ini的配置,还有系统权限的配置,一下是我总结的一些配置 一.PHP的模块 ./configure \ --with-libdir=lib64 \ --prefix ...