肉鬆 2022-06-06 09:56 采纳率: 0%
浏览 59
已结题

Linux 实现Write命令中文输出 管道 以及输出重定向

支持中文的Write命令实现
功能需求:
(1)实现对write命令的中文支持
(2)基于Linux文件系统的功能,实现不同用户间的通信
(3)支持管道、重定向

目前代码如下

#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>
#include  <string>
 
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;
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 已结题 (查看结题原因) 6月6日
    • 创建了问题 6月6日

    悬赏问题

    • ¥15 在centos7安装conda
    • ¥15 c#调用yolo3 dll文件获取的数据对不上
    • ¥20 WPF 如何实现多语言,label 和cs(live Charts)中是否都能翻译
    • ¥15 STM32F103上电短路问题
    • ¥15 关于#单片机#的问题:以ATMEGA128或相近型号单片机为控制器设计直流电机调速的闭环控制系统(相关搜索:设计报告|软件设计|流程图)
    • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
    • ¥15 (标签-python|关键词-char)
    • ¥15 python+selenium,在新增时弹出了一个输入框
    • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
    • ¥20 学生成绩管理系统设计