0

Think of this as a continuation of the good advice here: https://stackoverflow.com/a/56780616/16739703 except that I am hoping not to modify the child process.

Edit: I have written code which minimises to:

#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[], char *envp[]) {

  int init_flags=fcntl(0, F_GETFL, 0);

  if (fcntl(0, F_SETFL, init_flags | O_ASYNC)) {
    perror("fcntl...F_SET_FL....O_ASYNC");
    exit(1);
  }

  if (fcntl(0, F_SETOWN, getpid())) {
    perror("fcntl...F_SETOWN...)");
    exit(1);
  }


  if (execve(argv[1], argv+1, envp)) {
    perror("execve");
    exit(1);
  }

  return 1;
}

and this makefile:

all: morehup

CFLAGS=-g -D_GNU_SOURCE

LDFLAGS=-g

so that, with this procedure:

parent> export TMPDIR="$(mktemp -d)"
parent> mkfifo $TMPDIR/fifo
parent> sh
 # you get a new shell, probably with a different prompt
parent> exec 7<>$TMPDIR/fifo
 # must be both input and output, or the process stalls

child> TMPDIR=...   # as other shell    
child> ./morehup <$TMPDIR/fifo /bin/sh -c "while true; do date; sleep 5; done"
# you get a list of dates

parent> exit

child> I/O possible  # followed by a prompt, with no more dates

the kernel will kill the child when the parent exits.

The more configurable version is here: https://github.com/JamesC1/morehup/blob/main/morehup.c

I have two questions:

What are the chances of adding modest amounts of code, so that this will mostly work for most of the common *nix?

Is there a posix utility that already does something like this? ie am I reinventing the wheel, and if so, what is it called?

JamesC1
  • 1
  • 1
  • 3
    Please post the code in the question and not as an external link. Please ensure that it is a [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example). – kaylum Aug 24 '21 at 11:05
  • I have edited the minimal reproducible example into the original question. – JamesC1 Aug 26 '21 at 09:42

0 Answers0