# Access C stdout in Julia

**URL:** https://discourse.julialang.org/t/access-c-stdout-in-julia/24187
**Category:** General Usage
**Created:** [May 13, 2019, 8:40pm UTC](https://discourse.julialang.org/t/access-c-stdout-in-julia/24187 "2019-05-13T20:40:11Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![abhinav\_mehndiratta](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/abhinav_mehndiratta/32/7924_2.png) [@abhinav\_mehndiratta](https://discourse.julialang.org/u/abhinav_mehndiratta)
#### Post date: [May 13, 2019, 8:40pm UTC](https://discourse.julialang.org/t/access-c-stdout-in-julia/24187/1 "2019-05-13T20:40:11Z")

</div>

I am trying to write a wrapper for an external library(GraphBLAS). One of the matrix print functions expects a FILE\* pointer in its arguments so I tried this

```julia
ccall(dlsym(hdl, "GxB_Matrix_fprint"), Cint, (GrB_Matrix, Ptr{UInt8}, Cint, Ptr{Nothing}), X, xname, 3, cglobal(:stdout))

```

but I get a segmentation fault -

```julia
signal (11): Segmentation fault
in expression starting at no file:0
_IO_vfprintf_internal at /build/glibc-LK5gWL/glibc-2.23/stdio-common/vfprintf.c:1320

```

What is the right way to read stdout ?

---

<div class="post-metadata">

### Author: ![jmert](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jmert/32/3161_2.png) [@jmert](https://discourse.julialang.org/u/jmert)
#### Post date: [May 13, 2019, 10:12pm UTC](https://discourse.julialang.org/t/access-c-stdout-in-julia/24187/2 "2019-05-13T22:12:43Z")

</div>

This seems to work, though I can’t claim that it’s the best way to do it.

```julia
stdoutfd = 1; # or Base._fd(stdout)
fd = ccall(:dup, Cint, (Cint,), stdoutfd)
FILE = ccall(:fdopen, Ptr{Cvoid}, (Cint, Cstring), fd, "w")
ccall(:fprintf, Cint, (Ptr{Cvoid}, Cstring, Cint), FILE, "Test %i\n", 1);
ccall(:fclose, Cint, (Ptr{Cvoid},), FILE)

```

---

<div class="post-metadata">

### Author: ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)
#### Post date: [May 13, 2019, 10:19pm UTC](https://discourse.julialang.org/t/access-c-stdout-in-julia/24187/3 "2019-05-13T22:19:20Z")

</div>

cglobal returns the address of the variable and you need to load it.

---

<div class="post-metadata">

### Author: ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)
#### Post date: [May 13, 2019, 10:33pm UTC](https://discourse.julialang.org/t/access-c-stdout-in-julia/24187/4 "2019-05-13T22:33:43Z")

</div>

You can also use `Libc.FILE(io)` to convert a Julia `io` stream to a `FILE*` for passing to C code. Unfortunately, it doesn’t work with `stdout`, but you can use the fact that C’s `stdout` corresponds to the file descriptor `1` to construct a `RawFD` object and from this construct a `FILE*`:

```julia
julia> so = Libc.FILE(Libc.RawFD(1), "w") # corresponds to C standard output
Base.Libc.FILE(Ptr{Nothing} @0x00007fff947df0c8)

julia> ccall(:fprintf, Cint, (Ptr{Cvoid}, Cstring), so, "Hello world!\n")
Hello world!
13

```

---

<div class="post-metadata">

### Author: ![abhinav\_mehndiratta](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/abhinav_mehndiratta/32/7924_2.png) [@abhinav\_mehndiratta](https://discourse.julialang.org/u/abhinav_mehndiratta)
#### Post date: [May 14, 2019, 5:55am UTC](https://discourse.julialang.org/t/access-c-stdout-in-julia/24187/5 "2019-05-14T05:55:26Z")

</div>

Thank you everyone !
