Re: freebsd: unix socket programmering

From: Michael Knudsen (none@e--molioner.dk.lh.bsd-dk.dk)
Date: Wed 09 Jul 2008 - 22:08:32 CEST


Date: Wed, 9 Jul 2008 22:08:32 +0200
From: Michael Knudsen <none@e--molioner.dk.lh.bsd-dk.dk>
To: bsd-dk@bsd-dk.dk
Subject: Re: freebsd: unix socket programmering

Quoting Michael Rasmussen (mir@datanom.net):
[..]
> > Mit umiddelbare bud er, at han har aendret noget andet. (: Der er
> > ikke forskel.
> >
> Næ, det skyldes at struct sockaddr_un har følgende definition:
> #define UNIX_PATH_MAX 108
>
> struct sockaddr_un {
> sa_family_t sun_family; /* AF_UNIX */
> char sun_path[UNIX_PATH_MAX]; /* pathname */
> };
>
> sizeof (struct sockaddr_un) vil altid returnere 109, da sun_path er et
> array med plads til 108 bytes. Den faktiske længde af sun_path er ikke
> en konstant, da længden afhænger af den givne path - ikke brugte
> pladser i array vil være 0-paddet. Derfor vil strlen(sun_path) variere,
> mens sizeof(sun_path) vil være en konstant.

Hvad for noget? sun_path har allokeret (100 * sizeof(char)) == 100
bytes, ligegyldigt hvor meget af det du saa bruger. sizeof() evalueres
paa compile-time. Den ved intet om, hvor meget du bruger paa runtime.
Det er ikke strlen().

Se nu her:

Script started on Wed Jul 9 22:03:05 2008
luggage$ cat /tmp/sizeof.c
#include <stdio.h>

#define ARRAYSZ 100
struct bras {
        int hurra;
        char ohno[ARRAYSZ];
};

int
main(int argc, char **argv)
{
        struct bras a;

        printf("sz a %zd sz bras %zd\n", sizeof(a), sizeof(struct
            bras));

        return 0;
}
luggage$ make sizeof
`sizeof' is up to date.
luggage$ ./sizeof
sz a 104 sz bras 104
luggage$ ^D

Script done on Wed Jul 9 22:03:17 2008

Mvh. Michael.

-- 
``Light travels faster than sound. This is why some
people appear bright until you hear them speak.''



This archive was generated by hypermail 2b30 : Thu 31 Jul 2008 - 23:00:01 CEST