Portál AbcLinuxu, 4. května 2025 01:38

Dotaz: čtení /proc/sys/dev/cdrom/info

Jardík avatar 12.11.2006 00:02 Jardík | skóre: 40 | blog: jarda_bloguje
čtení /proc/sys/dev/cdrom/info
Přečteno: 271×
Odpovědět | Admin
Mám takový problém. Snažím se přečíst soubor /proc/sys/dev/cdrom/info, bohužel se mi nedaří. Soubor je otevřen POSIX funkcí open() s přístupem O_RDONLY. Soubor se otevře (tj. funkce nevrátí -1). Poté v cyklu načítám bajt po bajtu (v souboru nelze seekovat a zjistit tak jeho velikost):
while( read( fd, (void*)&bajt, 1 ) == 1 )
{
  ....
}
Problém je v tom, že se načte pouze první znak. Pro další pak funkce vrátí 0 (ne -1, což by znamenalo chybu). Zajímalo by mě, jak takový soubor načíst.
Věřím v jednoho Boha.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Jardík avatar 13.11.2006 21:04 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: čtení /proc/sys/dev/cdrom/info
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak jsem se porozhlídnul všude možně po internetu a našel jsem jeden útržek kódu, kde na soubor v proc byly také použity fce open a read s tím rozdílem, že tam byl buffer něco přes 8000. Poprvé bylo vrácen počet přečtených bajtů a v druhé 0 (tj. EOF). Tak mě napadá, jestli se celý soubor nemusí přečíst najednou????? Nějak se mi kvůli tomu nechce prasit můj kód, takže se radši ptám. Pokud nikdo vědět nebude, tak to asi vyzkouším. Následuje výstup strace -r, kde se načte jen první znak C ze souboru. Zajímavé je, cat vypíše soubor celý (že by dostatečný buffer?). Další zarážející věcí je, že funkce getline() si klidně čte po řádcích. Jak jsem ale řekl, chtěl bych použít funkci open() a read() - kvůli jiným možnostem otevírání, než mi nabízí funkce fopen().
0.000040 write(1, "Debug: Application constructor -"..., 40) = 40
0.000491 write(1, "Debug: Application contructor - "..., 37) = 37
0.000170 brk(0)                    = 0x804a000
0.000027 brk(0x806b000)            = 0x806b000
0.000043 open("/proc/sys/dev/cdrom/info", O_RDONLY|O_LARGEFILE) = 3
0.000073 write(1, "File opened", 11) = 11
0.000069 write(1, "\n", 1)         = 1
0.000081 read(3, "C", 1)           = 1
0.000041 write(1, "Debug: something readed\n", 24) = 24
0.000088 read(3, "", 1)            = 0
0.000028 write(1, "C", 1)          = 1
0.000059 write(1, "\n", 1)         = 1
0.000073 read(3, "", 1)            = 0
0.000031 write(1, "Debug: Application::run() - begi"..., 35) = 35
0.000088 close(3)                  = 0
Zde je část kódu programu:
int main( ... )
{
	...
	File cdroms;
	File stdOut;
	stdOut.openStdOut();
	if( cdroms.open("/proc/sys/dev/cdrom/info", fmReadOnly ) )
	{
		stdOut.writeLine("File opened");
		String line;
		while( cdroms.readLine(line) )
		{
			stdOut.writeLine(line);
		}
		cdroms.close();
	}
	...
}

bool File::open( const String& fileName, FileMode mode, Permission perms )
{
	close();
	m_pHandle = ::open( fileName.cStr(), mode | O_LARGEFILE, (mode_t)perms );
	return opened();
}

Int64 File::read( Byte *data, Int64 size ) const
{
	if( size <= 0 ) return 0;
	if(!opened()) return -1;
	Int64 totalReaded = 0;
	Int64 readed = 0, toRead = 0;
	do{
		toRead = MIN(size-totalReaded,SSIZE_MAX);
		readed = (Int64)::read( m_pHandle, (void*)data, (size_t)toRead );
		if( readed == 0 ) break; //EOF
		if( readed < 0 ) return readed; //error
		totalReaded += readed;
		data += readed;
	} while(totalReaded < size);	
	return totalReaded;
}

bool File::readLine( String& str ) const
{
	bool somethingReaded = false;
	str.clear();
	Char chr;
	
	if( read( (Byte*)&chr, 1 ) == 1 )
	{
		somethingReaded = true;
		do{
			if( chr == 0 ) break;
			else if( chr == '\r' ) {
				prevR = true;
				break;
			} else if( chr == '\n' ) {
				if(prevR) {
					prevR = false;
					continue;
				} else break;
			} else {
				prevR = false;
				str.append(chr);
			}
		} while( read( (Byte*)&chr, 1 ) == 1 );
	}
	
	return somethingReaded;
}
Věřím v jednoho Boha.
Jardík avatar 13.11.2006 21:33 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: čtení /proc/sys/dev/cdrom/info
Hmm, takže jsem se dočetl, že je to bug v kernelu: http://lkml.org/lkml/2006/10/20/121.
Věřím v jednoho Boha.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.