C语言实现shell命令ls思路,自己动手写shell命令之write

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

#include

#include

#include

#include

#include

#include

#include

#include

#include

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值