Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11680[/thread]

strftime stuerzt ab

Leser: 1


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
betterworld
 2008-04-22 03:58
#108669 #108669
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Hallo,

folgendes Programm stuerzt bei mir ab. Abstuerzen bedeutet hier ewig laufen. Laut strace moechte es offenbar sein restliches Leben damit verbringen, wiederholt /etc/localtime zu staten. Habe es auf Debian und Gentoo mit Perl 5.8.8 probiert.
Code: (dl )
1
2
3
use POSIX qw(locale_h strftime);
setlocale( LC_ALL, "de_DE.ISO8859-1" );
print strftime( "%p", localtime( time + 40000 ) );


Mit einer en_US-locale stuerzt es nicht ab, sondern gibt "PM" aus. Mit der deutschen locale eben gar nichts. Ist das gut?

Da strftime eigentlich aus der libc kommt, habe ich ein C-Programm probiert, was eigentlich dasselbe tun sollte, und es stuerzt nicht ab (gibt aber nichts aus):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <time.h>
#include <stdio.h>
#include <locale.h>

int
main (void)
{
setlocale(LC_ALL, "de_DE.ISO8859-1");
time_t tt = time(NULL);
struct tm *t = localtime(&tt);
char s[100];
strftime(s, 100, "%p", t);
printf("%s\n", s);
return 0;
}
KurtZ
 2008-04-22 04:23
#108670 #108670
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
betterworld+2008-04-22 01:58:48--
Code: (dl )
1
2
3
use POSIX qw(locale_h strftime);
setlocale( LC_ALL, "de_DE.ISO8859-1" );
print strftime( "%p", localtime( time + 40000 ) );


Also bei mir Debian Perl5.8.4 läufts fix durch und gibt %p aus
(vermute jetzt aber das das nicht der gewünschte Effekt ist... : )

Gruß
Kurt
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-04-22 04:29
#108671 #108671
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
%p Either `AM' or `PM' according to the given time value, or the
corresponding strings for the current locale. Noon is treated
as `pm' and midnight as `am'. Note that in many locales `am'
and `pm' notation is unsupported and in such cases %p will
return an empty string.



sag mal ... macht es Sinn bei deutschem locale AM oder PM abzufragen¿!?
TMTOWTDYOG (there's more than one way to dig your own grave)
nepos
 2008-04-22 10:51
#108682 #108682
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nein, das gibts bei uns nicht.
pq
 2008-04-22 12:04
#108689 #108689
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
debian, This is perl, v5.8.8 built for i486-linux-gnu-thread-multi
=> läuft ewig mit 100% cpu
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
nepos
 2008-04-22 12:17
#108691 #108691
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Die 100% CPU sind:
Quote
time([1208852200]) = 1208852200
open("/etc/localtime", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=2295, ...}) = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=2295, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f82000
read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\10\0"..., 4096) = 2295
close(3) = 0
munmap(0xb7f82000, 4096) = 0
time([1208852200]) = 1208852200
stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2295, ...}) = 0
stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2295, ...}) = 0
stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2295, ...}) = 0
stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2295, ...}) = 0
stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2295, ...}) = 0
...


Scheint wohl ein Bug in POSIX oder Perl zu sein.
betterworld
 2008-04-22 13:42
#108703 #108703
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
KurtZ+2008-04-22 02:29:53--
sag mal ... macht es Sinn bei deutschem locale AM oder PM abzufragen¿!?

Eigentlich nicht, aber das ist noch kein Grund fuer perls Verhalten :)

Andererseits ist Code, der Locales benutzt, ja eigentlich dazu gedacht, in unterschiedlichen Umgebungen zu laufen. Also kann er auch mal in einer deutschen Umgebung laufen. Wie man an dem C-Programm sieht, gibt strftime da einfach einen leeren String zurueck. Der Programmierer muss in so einem Fall dann wohl einfach die Zeit im 24-Stunden-Format angeben.

Dass strftime einen leeren String zurueckgibt, scheint aber an sich noch nicht problematisch zu sein. Wenn ich "" als Format angebe, haengt sich perl jedenfalls nicht auf.
nepos
 2008-04-22 13:56
#108704 #108704
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Perl sollte sich bei eonem locale, das kein AM/PM kennt, nicht einfach in der Endlosschleife versenken.
renee
 2008-04-22 14:05
#108707 #108707
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Macht am Besten einen Bugreport auf (aber bitte per perlbug und nicht auf CPAN)...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Linuxer
 2008-04-22 15:12
#108714 #108714
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hm, auf Gentoo mit selbstkompilierten perl 5.10.0 funktioniert das ganze soweit,
dass "%p" ausgegeben wird, wenn das locale das nicht unterstützt.

meine 5.10 nutzt POSIX 1.13 (und funktioniert, siehe oben);
meine 5.8.8 nutzt POSIX 1.09 (und bleibt so hängen wie hier schon beschrieben).
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2008-04-22 03:58.