繁体   English   中英

在C中使用read()和write()代替scanf()和printf()

[英]Using read() and write() in place of scanf() and printf() in C

我想使用read()write()方法而不是原始的scanf()printf()来读取和写入控制台,因为第一个使用信号支持系统调用。

我必须制作一个微型Unix外壳程序,该外壳程序在执行命令时会插入到子级中。 这是我最初的测试阅读和写作的尝试:

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define COMMAND_LENGTH 1024
#define NUM_TOKENS (COMMAND_LENGTH / 2 + 1)

void read_command(char *buff, char *tokens[], _Bool *in_background) {
    // to be implemented later
}

void createStr(char **str) {
    if (*str != NULL) {
        free(*str);
        *str = NULL;
    }
    *str = (char*)malloc(sizeof(char) * COMMAND_LENGTH);
}

void delStr(char** str) {
    if (*str != NULL) {
        free(*str);
        *str = NULL;
    }
}

int main(int argc, char *argv[]) {
    char input_buffer[COMMAND_LENGTH];
    char *tokens[NUM_TOKENS];
    char *inp = NULL;
    while (true) {
        write(STDOUT_FILENO, "> ", strlen("> "));

        createStr(&inp);
        read(STDIN_FILENO, input_buffer, sizeof(char) * COMMAND_LENGTH);
        strcpy(inp, input_buffer);
        write(STDOUT_FILENO, inp, strlen(inp));
        _Bool in_background = false;
        read_command(inp, tokens, &in_background);
    }
    delStr(&inp);
    return 0;
}

我的样本输入输出不是所需的。 这是一个示例输出:

> Peterson
Peterson
��> Makr  
Makr
son
��> Mark
Mark
son
��> Jon
Jon
son
��>

我不知道怎么回事。 就像为什么出现特殊字符,以及在新输入中包含我上次输入的部分内容一样。 在这方面我需要帮助。

您必须存储read的返回值,在将字符串传递给strcpy之前,确保read已完成,并且null终止该字符串。 read确实可以被信号中断,在这种情况下必须重新启动。 read也可以返回部分行,您应该继续阅读并连接到命令缓冲区中,并在需要时仔细重新分配缓冲区,直到收到字符'\\n'的文件结尾为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM