Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

如果数据收发正常,说明隧道正常。如果有问题就重启 ssh 子进程。

Fork 进程

主要的逻辑位于 ssh_run 函数中:在 while 循环中,使用 fork 函数生成一个子进程。

Code Block
cchild = fork();
// fork 函数的返回,子进程从此处执行,子进程返回 0,父进程返回子进程的 pid,错误返回 -1,errorno 说明错误原因
switch (cchild) {
case 0:
	errlog(LOG_DEBUG, "child of %d execing %s",
		getppid(), av[0]);
    // evecvp 执行的是 ssh 命令,此处阻塞执行
	execvp(av[0], av);
	errlog(LOG_ERR, "%s: %s", av[0], strerror(errno));
		/* else can loop restarting! */
    // 使用 SIGTERM kill 父进程
	kill(getppid(), SIGTERM);
	_exit(1);
	break;
case -1:
    // 出错的情况下
	cchild = 0;
	xerrlog(LOG_ERR, "fork: %s", strerror(errno));
	break;
default:
    // 父进程继续执行
	errlog(LOG_INFO, "ssh child pid is %d", (int)cchild);
	set_sig_handlers();
	retval = ssh_watch(sock);
	dolongjmp = 0;
	clear_alarm_timer();
	unset_sig_handlers();
	if (retval == P_EXITOK || retval == P_EXITERR)
		return retval;
	break;
}

监控子进程

在 conn_test 函数中实现了监听端口了传输数据的流程,用于 ssh 进程的隧道是否联通。

...