• code Linux
    Жуйк, как сделать это из баша?
    
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/ioctl.h>
    
    int main (int argc, char **argv)
    {
    	pid_t pid;
    
    	/*
    	 * parent exits
    	 * child gets rid of its tty and then shift-runs its arguments
    	 */
    	pid = fork();
    	if (pid < 0) {
    		return 1;
    	} else if (pid == 0) {
    		ioctl (0, TIOCNOTTY);
    		execvp (argv[1], argv + 1);
    	} else {
    		return 0;
    	}
    
    }
    ♡ recommended by @oreolek, @O01eg, @anton0xf
  • function xx() {"$@";}
    xx echo 0 &
  • @mechmind, Это на чем? :)
  • @mechmind, разве оно делает, то же самое?
  • @anton0xf, Насчет 'ioctl (0, TIOCNOTTY);' не уверен, не знаю за что отвечает конкретно этот вызов.
  • @mechmind, это я слегка прогнал. Правильная последовательность: open(fd, "/dev/tty", 0); ioctl(fd, TIOCNOTTY); close(fd); Она отцепляет процесс от эмулятора терминала — мелочь (SIGHUP через exec не пройдет все равно), а приятно. Правда, все равно придется потом закрыть 0, 1, 2, иначе все равно будет читать с/писать в эмулятор, с которого запустили. Но для моих целей (run gvim file.c из-под терминала в нужной директории) это вполне годится.