给出c语言代码支持中文的Write命令实现,1)实现对write命令的中文支持 (2)基于Linux文件系统的功能,实现不同用户间的通信 (3)支持管道、重定向,学习write命令功能; (2)学习who命令的c语言实现方法,了解获取登录用户终端设备名的方法; (3)给用户终端设备写操作
时间: 2024-02-20 18:57:06 浏览: 79
以下是一个支持中文的Write命令的C语言实现,包括基于Linux文件系统的管道和重定向功能,以及支持who命令和给用户终端设备写操作的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <locale.h>
#define BUFFER_SIZE 1024
// 支持中文的Write命令实现
void write_cmd(char *target, char *msg) {
// 打开目标终端设备
int fd = open(target, O_WRONLY);
if (fd == -1) {
perror("open");
return;
}
// 将消息写入目标终端设备
if (write(fd, msg, strlen(msg)) == -1) {
perror("write");
}
// 关闭目标终端设备
close(fd);
}
// 基于Linux文件系统的管道和重定向功能实现
void pipe_redirect(char *input, char *output, char *msg) {
int fd_in = 0, fd_out = 1;
// 如果存在输入重定向符号,则打开指定文件作为输入
if (input) {
fd_in = open(input, O_RDONLY);
if (fd_in == -1) {
perror("open");
return;
}
dup2(fd_in, STDIN_FILENO);
close(fd_in);
}
// 如果存在输出重定向符号,则打开指定文件作为输出
if (output) {
fd_out = open(output, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd_out == -1) {
perror("open");
return;
}
dup2(fd_out, STDOUT_FILENO);
close(fd_out);
}
// 判断是否存在管道符号
if (strstr(msg, "|")) {
char *cmd1 = strtok(msg, "|");
char *cmd2 = strtok(NULL, "|");
int fd[2];
pid_t pid;
// 创建管道
if (pipe(fd) == -1) {
perror("pipe");
return;
}
// 创建子进程
pid = fork();
if (pid == -1) {
perror("fork");
return;
}
else if (pid == 0) {
// 子进程执行第一个命令
close(fd[0]);
dup2(fd[1], STDOUT_FILENO);
close(fd[1]);
system(cmd1);
exit(EXIT_SUCCESS);
}
else {
// 父进程执行第二个命令
close(fd[1]);
dup2(fd[0], STDIN_FILENO);
close(fd[0]);
system(cmd2);
exit(EXIT_SUCCESS);
}
}
else {
// 没有管道符号,直接执行命令
system(msg);
}
}
// who命令的C语言实现方法,获取登录用户终端设备名
void who_cmd() {
char buffer[BUFFER_SIZE];
FILE *fp = popen("who", "r");
if (fp == NULL) {
perror("popen");
return;
}
while (fgets(buffer, BUFFER_SIZE, fp)) {
char *user = strtok(buffer, " ");
char *tty = strtok(NULL, " ");
printf("%s is logged in on %s\n", user, tty);
}
pclose(fp);
}
// 给用户终端设备写操作
void write_terminal(char *msg) {
char *tty = ttyname(STDOUT_FILENO);
write_cmd(tty, msg);
}
// 主函数
int main(int argc, char *argv[]) {
setlocale(LC_ALL, ""); // 设置当前环境为支持中文
if (argc < 2) {
printf("Usage: %s target [msg]\n", argv[0]);
return EXIT_FAILURE;
}
char *target = argv[1];
char *msg = argv[2] ? argv[2] : "Hello, world!";
char *input = NULL, *output = NULL;
// 解析命令行参数,获取输入输出文件名
for (int i = 2; i < argc; i++) {
if (strcmp(argv[i], "<") == 0) {
input = argv[++i];
}
else if (strcmp(argv[i], ">") == 0) {
output = argv[++i];
}
}
// 执行命令,并支持管道和重定向功能
pipe_redirect(input, output, msg);
// 支持中文的Write命令实现
write_cmd(target, msg);
// who命令的C语言实现方法,获取登录用户终端设备名
who_cmd();
// 给用户终端设备写操作
write_terminal("Hello, terminal!");
return EXIT_SUCCESS;
}
```
注意:此代码仅作为示例,可能存在漏洞和不足之处,不适用于生产环境。
阅读全文