I'm assuming you don't want to use postRun for a function named wasm_init? Of those hooks, you'd probably want to use preRun, which when I try it doesn't work with "Assertion failed: invalid handle for stdin (1)".
My understanding of why printf doesn't work there is because postRun is ran after main returns, so the wasm runtime doesn't flush the written buffer, and preRun is called before the runtime is initialized. Looking at the timings in the run function (that calls Module['_main']) here: https://github.com/kripken/emscripten/blob/incoming/src/postamble.js#L222 , we want to run static initializers (that can print, at least) before we call main, but after the runtime is initialized. It looks like preMain is the right timing, but how to put callbacks there? We have a function, addOnPreMain, that does the trick: https://github.com/kripken/emscripten/blob/incoming/src/preamble.js#L1693 . So to do that, we create a post-script file, shell_post.js, with the contents: addOnPreMain(function() { Module.ccall('wasm_init', null, []); }); Then we compile with emcc hello.c -s WASM=1 -o hello.html --shell-file shell.html --post-js shell_post.js And our output is: printf wasm_init Module.print wasm_init printf main Module.print main On Mon, Jul 31, 2017 at 9:09 PM 'Dominic Mazzoni' via emscripten-discuss < [email protected]> wrote: > Hi - I'm having trouble mixing calls to printf (for logging/debugging) > with reading and writing files from the built-in MEMFS. Hopefully I'm just > doing something stupid - perhaps postRun is the wrong place to insert a > function call? > > I'm on Mac OS X 10.12.5, and I compiled emsdk from source according to the > instructions at webassembly.org > <http://webassembly.org/getting-started/developers-guide/>. > > For my minimal repro, make a copy of > emscripten/incoming/src/shell_minimal.html and modify the postRun line to > be: > > postRun: [function() { Module.ccall('wasm_init', null, []); }], > > Then create a file hello.c like this: > > #include <stdio.h> > #include <emscripten/emscripten.h> > > int main(int argc, char ** argv) { > printf("printf main\n"); > EM_ASM(Module.print("Module.print main")); > } > > #ifdef __cplusplus > extern "C" { > #endif > > int EMSCRIPTEN_KEEPALIVE wasm_init() { > FILE* fp = fopen("test.txt", "w"); > printf("printf wasm_init\n"); > EM_ASM(Module.print("Module.print wasm_init")); > return 0; > } > > #ifdef __cplusplus > } > #endif > > And compile it like this: > > emcc hello.c -s WASM=1 -o hello.html --shell-file shell.html > > What I get: > > printf main > Module.print main > Module.print wasm_init > > What I expect to get: > > printf main > Module.print main > printf wasm_init > Module.print wasm_init > > Important note: if I comment out the fopen line, it succeeds (the second > printf works). If I use other mechanisms to log and debug, I can confirm > that the fopen is succeeding - just somehow once I call fopen just once I > can't use printf to write to Module.print anymore. > > Thanks! > > -- > You received this message because you are subscribed to the Google Groups > "emscripten-discuss" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
