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

[FDclone-users:00478] Re: 疑似端末有効かつバックグラウンドプロセスを起動すると LOG_DIR しても PWD が変わらない



 しらいです。

In Message-Id <20060322164355.20C5140C128@yuka.unixusers.net>
        Takashi SHIRAI <shirai@unixusers.net>writes:
>  しらいです。

>  孫が死んだことを子が知るには、明示的に wait(2) で待つ以外
> に SIGCHLD で感知する方法があります。bgnotify flag を有効に
> すると、明示的に待っている時以外に死んだ場合も感知出来ます。

 この patch ちょっとまずいですね。タイミングが悪いと freeze
することがあるようです。[FDclone-users:00477] の patch は破
棄して下さい。
 で、代わりの対処法を考えてみました。


>  FDclone での process 間通信は必ず一方通行で、
> 	子 process -> 親 process
> 	親 process -> terminal emulator
> という経路しか用意していません。

 そもそもこの前提がウソでした。もう一つの経路、
	terminal emulator -> 子 process
を忘れていました。
 一方通行ですが三本あるので、この三種の間では全 process 間
で通信可能で、実際親から子に情報を渡す手段も用意してありまし
た。失念、失念。

 という訳で、孫が完了しないで子が生き続けている場合に、子の
CWD を親の指示で変更することが可能です。
 この方法だと、孫がずっと生き続けてても子の CWD を変更出来
るので、対処として確実ですね。この patch は、次期 release に
採用するだけでなく HISTORY にも挙げておきます。

---- Cut Here ----
diff -u ../old/FD-2.08a/backend.c ./backend.c
--- ../old/FD-2.08a/backend.c	Tue Feb  7 00:00:00 2006
+++ ./backend.c	Thu Mar 23 20:46:51 2006
@@ -1130,7 +1130,7 @@
 int fd, n;
 {
 	ptyinfo_t tmp;
-	char *s, *arg;
+	char *s, *arg, *cwd;
 	p_id_t pid;
 	short w1, w2, row[MAXWINDOWS];
 	int i;
@@ -1322,13 +1322,16 @@
 				if (s) free(s);
 				break;
 			}
+			if (recvstring(fd, &cwd) < 0) cwd = NULL;
 			resetptyterm(w1, 1);
 
 			sendbuf(ptylist[w1].fd, &n, sizeof(n));
 			sendstring(ptylist[w1].fd, s);
 			sendstring(ptylist[w1].fd, arg);
+			sendstring(ptylist[w1].fd, cwd);
 			if (s) free(s);
 			if (arg) free(arg);
+			if (cwd) free(cwd);
 			break;
 		default:
 			break;
diff -u ../old/FD-2.08a/termemu.c ./termemu.c
--- ../old/FD-2.08a/termemu.c	Tue Feb  7 00:00:00 2006
+++ ./termemu.c	Thu Mar 23 20:49:06 2006
@@ -638,6 +638,7 @@
 	sendbuf(emufd, &flags, sizeof(flags));
 	sendstring(emufd, command);
 	sendstring(emufd, arg);
+	sendstring(emufd, fullpath);
 }
 
 #if	!defined (_NOORIGSHELL) && !defined (NOJOB)
@@ -664,7 +665,7 @@
 char **commandp, **argp;
 int *flagsp;
 {
-	char *command, *arg;
+	char *command, *arg, *cwd;
 	int flags;
 
 	Xttyiomode(1);
@@ -675,6 +676,10 @@
 		if (command) free(command);
 		return(-1);
 	}
+	if (recvstring(ttyio, &cwd) >= 0 && cwd) {
+		VOID_C chdir2(cwd);
+		free(cwd);
+	}
 
 	keyflush();
 	if (!(flags & F_TTYIOMODE)) Xstdiomode();
---- Cut Here ----

                                               しらい たかし