Я пытаюсь сделать некоторые программы для модуля ядра/пользовательского уровня. Я получил предложение ранее использовать fdopen()
, который работал хорошо, но я выяснил, что я должен использовать open()
, read()
и write()
вместо этого. Я прочитал страницы руководства для них и подумал, что я правильно конвертировал fopen, fgets, fputs, и моя программа компилируется, но я не получаю желаемый результат.Что я делаю неправильно с read() и write()?
У меня есть таймер, если я вхожу ./userprogram -s (int) (name)
, например. ./userprogram -s 5 hello
, через 5 секунд он будет печатать hello
на консоли, общаясь с моим модулем ядра. После того, как я переключился на эти новые функции, вместо этого он печатает /lib/ld-uClibc.so.0
(и, кажется, дожидается ~ 5 секунд, несмотря на это). Мне также нужно изменить способ работы кода уровня ядра? Я думал, что просто смогу изменить программу уровня пользователя, и модуль ядра будет продолжать работать так, как раньше. Вот что я пробовал с оригинальным кодом, который работал закомментированным:
// open file
int pFile;
pFile = open("/dev/mytimer", O_RDWR);
if (pFile < 0) {
fprintf (stderr, "mytimer module isn't loaded\n");
return 1;
}
// Check if timer set
if (argc >= 4 && strcmp(argv[1], "-s") == 0) {
lenNum = strlen(argv[2]);
lenName = strlen(argv[3]);
char *ptr = malloc(lenNum+lenName+4);
strncat(ptr, argv[1], 2);//flag
strncat(ptr," ", 1);
strncat(ptr, argv[2], lenNum);//timer length
strncat(ptr," ", 1);
strncat(ptr, argv[3], lenName);//message
/* fputs(ptr, pFile); */
write(pFile, ptr, sizeof(ptr));
/*
while (fgets(line, 256, pFile) != NULL) {
printf("%s", line);
} */
while (read(pFile, ptr, sizeof(ptr)) != 0) {
printf("%s", line);
}
Любые предложения приветствуются.
Вы уже использовали 'open()', по крайней мере, если вы получали поток через 'fdopen()'. –
Я думаю, что я делал что-то вроде 'int file = open()' then 'FILE * pFile = fdopen (файл," r + ");' Затем использовал 'open()' on 'file' и' fgets() 'и 'fputs()' on 'pFile'. – Austin
'fdopen()' связывает поток с открытым файловым дескриптором. Вы должны каким-то образом получить файловый дескриптор, и это обычно происходит через 'open()'. Конечно, вы можете 'fdopen()' один из стандартных номеров файлов, но это бессмысленно, потому что вы уже бесплатно получаете 'stdin',' stdout' и 'stderr'. –