[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00478] Re: 疑似端末有効かつバックグラウンドプロセスを起動すると LOG_DIR しても PWD が変わらない
- Subject: [FDclone-users:00478] Re: 疑似端末有効かつバックグラウンドプロセスを起動すると LOG_DIR しても PWD が変わらない
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Thu, 23 Mar 2006 21:51:46 +0900
しらいです。
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 ----
しらい たかし