在 C 中使用 read() 和 write() 代替 scanf() 和 printf()
Using read() and write() in place of scanf() and printf() in C
我想使用 read()
和 write()
方法来读取和写入控制台,而不是原来的 scanf()
和 printf()
,因为第一个有系统调用支持使用信号。
我必须制作一个迷你 Unix shell,它会在执行命令时分叉为子级。这是我最初测试阅读和写作的尝试:
#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
的 return 值,验证 read
完成并在将字符串传递给 strcpy
之前以 null 终止该字符串。 read
确实可以被信号中断,在这种情况下必须重新启动。 read
也可以 return 部分行,您应该继续读取并连接到命令缓冲区,如果需要请仔细重新分配缓冲区,直到收到字符 '\n'
的文件结尾.
我想使用 read()
和 write()
方法来读取和写入控制台,而不是原来的 scanf()
和 printf()
,因为第一个有系统调用支持使用信号。
我必须制作一个迷你 Unix shell,它会在执行命令时分叉为子级。这是我最初测试阅读和写作的尝试:
#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
的 return 值,验证 read
完成并在将字符串传递给 strcpy
之前以 null 终止该字符串。 read
确实可以被信号中断,在这种情况下必须重新启动。 read
也可以 return 部分行,您应该继续读取并连接到命令缓冲区,如果需要请仔细重新分配缓冲区,直到收到字符 '\n'
的文件结尾.