linux命令实现:write

本文探讨了如何通过写操作实现终端之间的用户通信,并详细介绍了包括路径获取、系统调用和用户登录验证在内的关键步骤。重点阐述了如何利用C语言进行系统级通信,涉及文件操作、字符串处理和终端用户状态查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

write:用于终端之间的用户通信。

write [username] [终端]


代码实现

#include<stdio.h>
#include<stdlib.h>
#include<termios.h>
#include<unistd.h>
#include<utmp.h>
#include<fcntl.h>
#include<string.h>
#include<malloc.h>
#define PATH "/var/run/utmp"
#define PREPATH "/dev/"
char BUF[4096];
char *getpath(char *);
void write_p(char *); 
int main(int ac,char **av)
{
	if(ac != 2&&ac != 3){
		return ;
	}
	char *str;
	if(ac == 2){
		str = getpath(av[1]);
		write_p(str);
		return ;
	}
	if(find(av[2],av[1])) {
			printf("%s is not login this \n",av[1]);
			return;
	}
	write_p(av[2]);
}
char *getpath(char *name)//return stt* pts/*
{
	if(name == NULL) return NULL;
	struct utmp p;
	char *str = (char *)malloc(sizeof(char)*UT_LINESIZE);
	int fp;
	ssize_t rd;
	if((fp = open(PATH,O_RDONLY)) == -1){
		perror(PATH);
		exit(-1);
	}
	while((rd = read(fp,&p,sizeof(struct utmp))) != 0)
	{
		if(rd == -1){
			perror(PATH);
			exit(-1);
		}
		if(strcmp(name,p.ut_user) == 0) strcpy(str,p.ut_line);
	}
	if(strlen(str) == 0) {
		printf("no login\n");
		exit(-1);
	}
	return str;
}


void write_p(char *path)
{
	int fp;
	ssize_t rd;
	char str[256];
	strcpy(str,PREPATH);
	strcat(str,path);	
	if((fp = open(str,O_WRONLY)) == -1){
		perror(str);
		exit(-1);
	}
	while(fgets(BUF,4096,stdin) != NULL)
	{
		if(write(fp,BUF,strlen(BUF)) == -1){
			perror(str);
			exit(-1);
		}
	}
	return ;	
}
int find(char *path,char *name)
{
	int fp;
	ssize_t rd;
	struct utmp x;
	if((fp = open(PATH,O_RDONLY)) == -1){
		perror(PATH);
		exit(-1);
	}
	while((rd = read(fp,&x,sizeof(struct utmp))) != 0){
		if(rd == -1){
			perror(PATH);
			exit(-1);
		}
		if(strcmp(path,x.ut_line) == 0 && strcmp(name,x.ut_user) == 0) return 0;
	}
	return 1;

			
}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值