If you're looking for inter-process communication protocol to describe a "wait for an action completion" semantic, it can be implemented with named event and named mutex synchronization primitives. The simplest mechanism of using these primitives is when some process in your case parent process creates a named synchronization object and waits for the signaled state of the object:
var fileCreationEvent = new EventWaitHandle(false, EventResetMode.ManualReset, "MyGloballyVisibleEvent");
...
fileCreationEvent.WaitOne();
// read your file
and another process, child process in your case, gets an access to existing event and sets it to the signaled state once it completes the some expected action:
var fileCreationEvent = EventWaitHandle.OpenExisting("MyGloballyVisibleEvent");
...
// create file here
fileCreationEvent.Set();
This is a simplified flow which doesn't take into account some concurrency aspects such as possibility that there are multiple processes which can create/delete the target file. If these things are important the approach is pretty similar to an approach you'd apply locally inside single process. In that case a file is kind of shared state which should be protected against the race conditions and you can use named Mutex
for that in the same way as named event.