[LUGA] Mit freundlicher Unterstützung von:
WSR

Mail Thread Index


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [luga] TIOCNOTTY



On Thu, Sep 25, 1997 at 11:37:00AM +0200, Guenther Leber wrote:
> Ich schreib gerade einen forkenden Netzwerkserver.  Brav wie es sich
> gehört, öffne ich auch /dev/tty und mache anschließend ein
> ioctl(ttyfd, TIOCNOTTY, 0) um den Prozeß vom Controlling Terminal
> abzuhängen.  Irgendwie war ich der Meinung, daß dann Signale, die vom
> Terminal (i.e. User, der Control-C drückt) generiert werden, dann nicht
> an den Prozeß weitergegeben würden.  Soviel zur Theorie.
> 
> Hier die Praxis auf einem NEXT (68k und LANGSAM) mit XEXTSTEP 3.3.:
> Ich starte das Programm (im Vordergrund; könnte das eine Erklärung
> sein?) und wenn ich Control-C drücke, dann kommt das Signal durch
> 
> Meine Frage:  Did I miss anything in my theoretical analysis

Offensichtlich, denn unter Linux ist es das gleiche. Nach dem ioctl
gibt es zwar kein controlling tty mehr (Du kannst "/dev/tty" nicht mehr
öffnen), aber Signale erreichen den Prozess sehr wohl noch. Warum das so
ist, verstehe ich im Moment nicht. Du könntest versuchen, mit setsid
oder setpgid explizit eine neue Process Group zu eröffnen.

Kleines Testprogramm für obige Situation:

---%<------%<------%<------%<------%<------%<------%<------%<---
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

char *cmnd;

int main(int argc, char **argv) {

    int fd;
    
    cmnd = argv[0];
    if ((fd = open("/dev/tty", O_RDONLY)) == -1) {
	fprintf(stderr, "%s: cannot open %s: %s\n",
		cmnd, "/dev/tty", strerror(errno));
	exit(1);
    }
    if (ioctl(fd, TIOCNOTTY, 0) == -1) {
	fprintf(stderr, "%s: ioctl (TIOCNOTTY) failed: %s\n",
		cmnd, "/dev/tty", strerror(errno));
	exit(1);
    }
    close(fd);

    /* try to reopen tty (should fail) */

    if ((fd = open("/dev/tty", O_RDONLY)) == -1) {
	fprintf(stderr, "%s: cannot open %s (as expected): %s\n",
		cmnd, "/dev/tty", strerror(errno));
    } else {
	fprintf(stderr, "%s: still have a controlling tty!\n",
		cmnd);
	close(fd);
    }
    sleep (10);
    return 0;
}
---%<------%<------%<------%<------%<------%<------%<------%<---

	hp

-- 
   _  | Peter J. Holzer             | If I were God, or better yet
|_|_) | Sysadmin WSR                | Linus, I would ...
| |   | hjp@wsr.ac.at               |     -- Bill Davidsen
__/   | http://wsrx.wsr.ac.at/~hjp/ |        (davidsen@tmr.com)



powered by LINUX the choice of a gnu generation
linux user group austria;
Suche
Suche
Letzte Änderung:
webmaster@luga.at
September 2010