This form of open starts a child process. The return result is the child process ID. Thus, your open(...) || die ... will show the error if the child can't be created.
You need to check $? to check for errors from the child.
See this for an example of checking for errors in this situation.