Skip to content

Expand the scope of std::process #941

Closed

Description

@alexcrichton

Like #939, this issue is intended to collect information about the expansion of the std::process module. As with most of the rest of the I/O reform, the goal of std::process was originally to be quite conservative. Over time we knew we were going to want to expand the module after we got experience using it as well as seeing how this sort of expansion plays out in the bigger picture.

I'll list some pieces below of parts I think that could be expanded, and I'll try to keep the list updated over time:

As with #939 I don't plan on writing an RFC about this expansion in the near future, but I'd like one place to collect information about how std::process can be expanded.

Activity

  1. added a commit that references this issue on Mar 6, 2015
  2. l0kod commented on Mar 6, 2015

    @l0kod

    std::process should provide a way to deliberately leak file descriptors/handles and get/use them back (i.e. old Command::extra_io, lost with rust-lang/rust#18557), not only stdio.

  3. alexcrichton commented on Mar 6, 2015

    @alexcrichton
    MemberAuthor

    Certainly, I consider that to fall under the "It is not possible to specify a custom I/O handle as one of the stdio descriptors" umbrella where we're not really leaking them per-se but you should be able to specify that an existing file descriptor should exist as another in the new process.

  4. l0kod commented on Mar 21, 2015

    @l0kod

    A post-fork function (cf. #579 (comment)) seems to need properties similar to FnAsync (i.e. signal handler) to be safe.

  5. nagisa commented on May 18, 2015

    @nagisa
    Member

    Need to add a way to wait for children with a timeout.

  6. genodeftest commented on May 29, 2015

    @genodeftest

    I need a way to check whether a child process is still running or not.

  7. l0kod commented on Jun 20, 2015

    @l0kod

    Is there any plan to re-add detached(&mut self) to std::os::unix::process::CommandExt? Is there another way to do it without a manual unsafe fork(2) handling?

    cc @aturon

  8. added a commit that references this issue on Aug 4, 2015
  9. pnathan commented on Oct 11, 2015

    @pnathan

    Hi,

    I think this is the relevant RFC, just let me know if it isn't and I'll remove my comment and file elsewhere.

    About 1 year ago, I had a nice piece of code[0], which let me run a subprocess and provide streaming updates of its stdout/stderr descriptors. It is code which is intended for a long-running system: e.g., commands that run for hours and the controlling job needs to respond rather than block.

    Right now, Process::Command & family do not appear to support this ability. I think with certain abuses of the borrow checker, I can kludge my way to part of this, but it's a lot of fiddly work when really, the original API supported what I need.

    I'd like to see functionality in std::process explicitly for this case.

    [0] https://gist.github.com/pnathan/30e283cbcf2bf4f46346#file-action-lib-rs-L134

  10. BurntSushi commented on Oct 12, 2015

    @BurntSushi
    Member

    @pnathan I only briefly scanned your code, but why exactly can't you just read from the Child stdout/stderr descriptors?

  11. alexcrichton commented on Oct 12, 2015

    @alexcrichton
    MemberAuthor

    @pnathan I agree with @BurntSushi that what you did previously should definitely be possible with today's std::process. I also updated the checklist above and basically all I/O-related tasks have since been implemented in one form or another.

  12. pnathan commented on Oct 12, 2015

    @pnathan

    @alexcrichton @BurntSushi - hmm. Maybe I got into a corner with reading from the pipes, certainly has happened before. However, I still don't see any way in the API to check if a process is dead, only wait. Am I misunderstanding something?

  13. sfackler commented on Oct 12, 2015

    @sfackler
    Member

    We could pretty easily add a nonblocking version of wait but I don't think we do right now.

  14. alexcrichton commented on Oct 12, 2015

    @alexcrichton
    MemberAuthor

    @pnathan yeah there's not currently a way to do that, but that's largely because it's quite tricky! On Unix unfortunately kill with a 0 signal won't work reliably 100% of the time because there's no guarantee that the pid being verified hasn't been recycled. I think the best way to do this would be wait with WNOHANG, but that unfortunately needs builtin support that @sfackler mentioned.

    In the meantime though so long as you're careful with calling wait you can use this repo in the meantime which should allow you to wait with a timeout of 0.

  15. l0kod commented on Oct 12, 2015

    @l0kod

    On Unix unfortunately kill with a 0 signal won't work reliably 100% of the time because there's no guarantee that the pid being verified hasn't been recycled.

    On Linux, the PID is only recycled if the parent waits for the child exit code, otherwise it is transform into a zombie process.
    In the future, CLONE_FD could land in the kernel, which would be much safer.

  16. alexcrichton commented on Oct 12, 2015

    @alexcrichton
    MemberAuthor

    Ah right of course!

  17. mllken commented on Oct 25, 2015

    @mllken

    Another one for the list above- It is not possible to specify a custom I/O handle as one of the NON-stdio descriptors (extra_io)

  18. alexcrichton commented on Nov 10, 2015

    @alexcrichton
    MemberAuthor

    cc #1359, an RFC to add a few extra pieces of functionality on Unix

  19. LukasKalbertodt commented on Jan 31, 2016

    @LukasKalbertodt
    Contributor

    What about process groups or child processes of some Child? I don't know how this works with Windows, though. But I guess it should be somehow possible to get access to the process group of one spawned process.

  20. kamalmarhubi commented on Feb 1, 2016

    @kamalmarhubi
    Contributor

    With Linux, it'd be good to expose the PR_SET_CHILD_SUBREAPER prctl here. This would make the parent process play the role of init for any processes spawned by the child. Docs at prctl(2).

  21. alexcrichton commented on Feb 11, 2016

    @alexcrichton
    MemberAuthor

    With #1359 now implemented in rust-lang/rust#31409 (and tracked for stabilization by rust-lang/rust#31398) this issue should now basically be entirely possible using libstd itself.

    The original motivation has basically now been fulfilled, so I'm going to close this. There are perhaps some more specific APIs which could be added or bound, but those likely want to have separate issues or start out as crates on crates.io.

  22. kamalmarhubi commented on Feb 11, 2016

    @kamalmarhubi
    Contributor

    👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    T-libs-api[DEPRECATED; DO NOT USE]

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions