mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* read proc entry
@ 2002-04-13 13:48 Anthony Chee
  2002-04-13 13:58 ` Peter Wächtler
  0 siblings, 1 reply; 5+ messages in thread
From: Anthony Chee @ 2002-04-13 13:48 UTC (permalink / raw)
  To: linux-kernel

I written the following code in a module

static struct proc_dir_entry *test_proc;
test_proc = create_proc_read_entry(test_proc, 0444, NULL, read_test_proc,
NULL);

void show_kernel_message() {
    printk("\nkernel test\n");
}

int read_test_info(char* page, char** start, off_t off, int count, int* eof,
void* data) {
    show_kernel_message();
}

After I use "cat /proc/test_proc", it is found that there are three "kernel
test" messages
appear. Why it happened like this? I expected the message should be shown
once.


^ permalink raw reply	[flat|nested] 5+ messages in thread
* Re: read proc entry
@ 2002-04-13 14:19 James Washer
  0 siblings, 0 replies; 5+ messages in thread
From: James Washer @ 2002-04-13 14:19 UTC (permalink / raw)
  To: Anthony Chee; +Cc: linux-kernel


First, I think you miss typed the mail you sent the group... in your call
to create_proc_read_entry, you passed "read_test_proc" as the name of the
function, yet you've declared here a function named "read_test_info"...

However, in answer to your question.

Since, in your routine, you've done NOTHING to tell the kernel that your
routine is completed transfering data to *page, the kernel will call it
again looking for more data to be transferred.


The sad thing is, the way things work, nearly all proc read functions will
be called twice, even when they signal they are done using *eof=1;
Why? Because your userland processes, in this case 'cat', will make
additional calls to read(2) UNTIL it gets zero bytes signalling
end-of-file.

A well written proc read function CAN recognize this subsequent read, and
return early, but nearly every proc read shipping with the kernel today
does NOT. They simply place the same information in the buffer at *page a
2nd time and return the same number of bytes written. However, since the
function proc_file_read(), which calls your proc read function, checks for
data BEYOND the old data, proc_file_read will return 0 upstream to the user
on this 2nd attempt.

It's a bit confusing at first.. but take a good long look at proc_file_read
().

 - jim

"Anthony Chee" <anthony.chee@polyu.edu.hk>@vger.kernel.org on 04/13/2002
06:48:31 AM

Sent by:    linux-kernel-owner@vger.kernel.org


To:    <linux-kernel@vger.kernel.org>
cc:
Subject:    read proc entry



I written the following code in a module

static struct proc_dir_entry *test_proc;
test_proc = create_proc_read_entry(test_proc, 0444, NULL, read_test_proc,
NULL);

void show_kernel_message() {
    printk("\nkernel test\n");
}

int read_test_info(char* page, char** start, off_t off, int count, int*
eof,
void* data) {
    show_kernel_message();
}

After I use "cat /proc/test_proc", it is found that there are three "kernel
test" messages
appear. Why it happened like this? I expected the message should be shown
once.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/




^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2002-04-18 18:52 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-04-13 13:48 read proc entry Anthony Chee
2002-04-13 13:58 ` Peter Wächtler
2002-04-13 14:07   ` Anthony Chee
2002-04-18 18:48     ` Randy.Dunlap
2002-04-13 14:19 James Washer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®