Hi stackoverflow (ers)!Unix (in C) пытается написать хвост для XV6
Я учусь Unix с помощью xv6 ОС (документация нашли here) и пытался написать хвостовую функцию в С. Ожидаемый выход:
- хвост, чтобы дать последние 10 строк файл
- хвост - это дать последний из строк файла
- хвост ... чтобы дать последние 10 строк файлов ...
- хвост - ... чтобы дать последний линии ...
- gre p | tail должен дать последние 10 предложений, в которых содержатся
Я написал две версии хвоста, один из которых реализован с использованием char * [], а другой - путем записи в файл, а затем чтения из него (оба размещены ниже) Моя версия, которая реализует хвост с использованием char * [], кажется более точным для фактической команды. Однако в версии, где я пишу во временный файл, а затем читаю из него, я получаю больше строк в качестве вывода, и я не уверен, почему это происходит. Моя догадка заключается в том, что при чтении из одного файла и записи в другое место «\ n» перепуталось. Я был бы очень признателен за помощь в выяснении этого!
Пожалуйста, не сердитесь на меня, если я делаю что-то глупое. Я новичок в C в Unix и только пытаюсь учиться.
tail.c, используя символ * []
#include "types.h"
#include "stat.h"
#include "user.h"
#include "fcntl.h"
char buf [512];
void tail (int fd, int toSub) {
int n;
int numLines = 0;
int linesToPrint = 0;
char *buffer;
buffer = (char*) malloc (500000);
int buffSize = 0;
while ((n = read(fd, buf, sizeof(buf))) > 0) {
for (int i = 0; i<n; i++) {
buffer[buffSize] = (char)buf[i];
buffSize++;
if(buf[i] == '\n')
numLines++;
}
}
if (n < 0) {
printf (1, "tail: read error \n");
exit();
}
if (numLines < toSub)
linesToPrint = 0;
linesToPrint = numLines - toSub;
int counter = 0;
for (int i = 0; i < buffSize; i++) {
if (counter >= linesToPrint)
printf(1,"%c",buffer[i]);
if (buffer[i] == '\n')
counter++;
}
free (buffer);
}
int main (int argc, char *argv[]) {
int toSub = 10;
int fd = -1;
if (argc <= 1) {
tail (0, toSub);
exit();
}
else if (argc > 1 && argv[1][0] == '-') {
char getToSub [10];
for (int k=1; k<strlen(argv[1]); k++) {
getToSub[k-1] = argv[1][k];
}
toSub = (atoi)(getToSub);
}
else {
if((fd = open (argv[1], toSub)) < 0) {
printf (1, "tail: cannot open %s\n", argv[1]);
exit();
}
tail (fd, toSub);
close (fd);
}
if (argc > 2) {
for (int i=2; i<argc; i++) {
if((fd = open (argv[i], 0)) < 0) {
printf (1, "tail: cannot open %s\n", argv[i]);
exit();
}
else {
tail (fd, toSub);
close (fd);
}
}
}
exit();
}
tail.c с помощью записи
#include "types.h"
#include "stat.h"
#include "user.h"
#include "fcntl.h"
char buf [512];
void tail (int fd, int toSub) {
int n;
int numLines;
int linesToPrint;
int ptrDump;
ptrDump = open ("tailDump", O_CREATE | O_RDWR);
while ((n = read(fd, buf, sizeof(buf))) > 0) {
write (ptrDump, buf, sizeof(buf));
for (int i = 0; i<n; i++) {
if(buf[i] == '\n')
numLines++;
}
}
if (n < 0) {
printf (1, "tail: read error \n");
exit();
}
if (numLines < toSub)
linesToPrint = 0;
linesToPrint = numLines - toSub;
close (ptrDump);
ptrDump = open ("tailDump", 0);
int counter = 0;
while ((n = read(ptrDump, buf, sizeof(buf))) > 0) {
for (int i = 0; i<n; i++) {
if (counter > linesToPrint)
printf(1,"%c",buf[i]);
if (buf[i] == '\n')
counter++;
}
}
close (ptrDump);
unlink("tailDump");
}
int main (int argc, char *argv[]) {
int toSub = 10;
int fd = -1;
if (argc <= 1) {
tail (0, toSub);
exit();
}
else if (argc > 1 && argv[1][0] == '-') {
char getToSub [10];
for (int k=1; k<strlen(argv[1]); k++) {
getToSub[k-1] = argv[1][k];
}
toSub = (atoi)(getToSub);
}
else {
if((fd = open (argv[1], toSub)) < 0) {
printf (1, "tail: cannot open %s\n", argv[1]);
exit();
}
tail (fd, toSub);
close (fd);
}
if (argc > 2) {
for (int i=2; i<argc; i++) {
if((fd = open (argv[i], 0)) < 0) {
printf (1, "tail: cannot open %s\n", argv[i]);
exit();
}
else {
tail (fd, toSub);
close (fd);
}
}
}
exit();
}
У меня есть код поставить на моем Github (нашел here), а также в tail_using_str.c и tail_using_file.c
Это исправлено! большое спасибо! Теперь, когда я думаю об этом, он имеет такой смысл! Я обновил код и дал вам заслуженный кредит! (Https://github.com/AdityaSingh/XV6/tree/Tail) –