# How do I obtain \`sizeof(struct sigaction)\`? Clang.jl?

**URL:** <https://discourse.julialang.org/t/how-do-i-obtain-sizeof-struct-sigaction-clang-jl/84344>\
**Category:** General Usage\
**Tags:** interoperability, c, signal-handling, clang\
**Created:** [July 17, 2022, 2:32am UTC](https://discourse.julialang.org/t/how-do-i-obtain-sizeof-struct-sigaction-clang-jl/84344 "2022-07-17T02:32:23Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![mkitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkitti/32/12459_2.png) [@mkitti](https://discourse.julialang.org/u/mkitti)\
**Post date:** [July 17, 2022, 2:32am UTC](https://discourse.julialang.org/t/how-do-i-obtain-sizeof-struct-sigaction-clang-jl/84344/1 "2022-07-17T02:32:23Z")

</div>

I would like to figure out the value printed by this C program in Julia.

```nohighlight
 #include <signal.h>
 #include <stdio.h>
 
 int main() {
     printf("%ld", sizeof(struct sigaction));
     return 0;
 }

```

On my system, this prints 152 bytes.

My /usr/include/x86\_64-linux-gnu/bits/sigaction.h has this definition:  
[https://sourceware.org/git/?p=glibc.git;a=blob;f=bits/sigaction.h;h=cef879f40aae8e14b2e998daeded26ebe5cfad9d;hb=HEAD#l32](https://sourceware.org/git/?p=glibc.git;a=blob;f=bits/sigaction.h;h=cef879f40aae8e14b2e998daeded26ebe5cfad9d;hb=HEAD#l32)

Other than building the C code above, is there a way to obtain the size of this struct within Julia?

---

<div class="post-metadata">

**Author:** ![mkitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkitti/32/12459_2.png) [@mkitti](https://discourse.julialang.org/u/mkitti)\
**Post date:** [July 17, 2022, 2:43am UTC](https://discourse.julialang.org/t/how-do-i-obtain-sizeof-struct-sigaction-clang-jl/84344/2 "2022-07-17T02:43:49Z")

</div>

Related: [Dealing with external libraries that don't restore old signal handlers](https://discourse.julialang.org/t/dealing-with-external-libraries-that-dont-restore-old-signal-handlers/84343)

---

<div class="post-metadata">

**Author:** ![Gnimuc](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gnimuc/32/2194_2.png) [@Gnimuc](https://discourse.julialang.org/u/Gnimuc)\
**Post date:** [July 17, 2022, 6:13am UTC](https://discourse.julialang.org/t/how-do-i-obtain-sizeof-struct-sigaction-clang-jl/84344/3 "2022-07-17T06:13:27Z")

</div>

[https://juliainterop.github.io/Clang.jl/stable/api/#Clang.getSizeOf-Tuple{CXType}](https://juliainterop.github.io/Clang.jl/stable/api/#Clang.getSizeOf-Tuple%7BCXType%7D)

---

<div class="post-metadata">

**Author:** ![mkitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkitti/32/12459_2.png) [@mkitti](https://discourse.julialang.org/u/mkitti)\
**Post date:** [July 17, 2022, 5:55pm UTC](https://discourse.julialang.org/t/how-do-i-obtain-sizeof-struct-sigaction-clang-jl/84344/4 "2022-07-17T17:55:29Z")

</div>

Here is the solution thanks to @Gnimuc !

```julia
julia> temp_header = tempname()*".h"
"/tmp/jl_Cvhf3N.h"

julia> open(temp_header, "w") do f
           write(f,
           """
           #include <stddef.h>
           #include <signal.h>
           
           const size_t sizeof_struct_sigaction = sizeof(struct sigaction);
           """
           )
       end
106

julia> trans = Clang.parse_header(Index(), temp_header, Clang.get_default_args())
TranslationUnit(Ptr{Clang.LibClang.CXTranslationUnitImpl} @0x00007f5ac0220fb0, Index(Ptr{Nothing} @0x0000000002f7cc10, 0, 1))

julia> cursor = Clang.getTranslationUnitCursor(trans)
CLCursor (CLTranslationUnit) /tmp/jl_6DBaOh.h

julia> sigaction = Clang.search(children(cursor), c->Clang.name(c) == "sigaction")[1]
CLCursor (CLStructDecl) sigaction

julia> Clang.getCursorType(sigaction) |> Clang.getSizeOf
152

```

---

<div class="post-metadata">

**Author:** ![mkitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkitti/32/12459_2.png) [@mkitti](https://discourse.julialang.org/u/mkitti)\
**Post date:** [July 18, 2022, 8:33am UTC](https://discourse.julialang.org/t/how-do-i-obtain-sizeof-struct-sigaction-clang-jl/84344/5 "2022-07-18T08:33:42Z")

</div>

As a compact function:

```julia
julia> using Clang

julia> function sizeof_sigaction()
           temp_header = tempname()*".h"
           open(temp_header, "w") do f
                  write(f, "#include <signal.h>\n")
           end
           trans = Clang.parse_header(Index(), temp_header, Clang.get_default_args())
           rm(temp_header)
           cursor = Clang.getTranslationUnitCursor(trans)
           sigaction = Clang.search(children(cursor), c->Clang.name(c) == "sigaction")[1]
           sigaction_type = Clang.getCursorType(sigaction)
           return Clang.getSizeOf(sigaction_type)
       end
sizeof_sigaction (generic function with 1 method)

julia> sizeof_sigaction()
152

```
