⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 loop.c

📁 unix高级编程源代码.<<unix高级编程>>
💻 C
字号:
#include	<sys/types.h>
#include	<signal.h>
#include	"ourhdr.h"

#define	BUFFSIZE	512

static void	sig_term(int);
static volatile sig_atomic_t	sigcaught;	/* set by signal handler */

void
loop(int ptym, int ignoreeof)
{
	pid_t	child;
	int		nread;
	char	buff[BUFFSIZE];
	if ( (child = fork()) < 0) {
		err_sys("fork error");

	} else if (child == 0) {	/* child copies stdin to ptym */
		for ( ; ; ) {
			if ( (nread = read(STDIN_FILENO, buff, BUFFSIZE)) < 0)
				err_sys("read error from stdin");
			else if (nread == 0)
				break;		/* EOF on stdin means we're done */

			if (writen(ptym, buff, nread) != nread)
				err_sys("writen error to master pty");
		}

			/* We always terminate when we encounter an EOF on stdin,
			   but we only notify the parent if ignoreeof is 0. */
		if (ignoreeof == 0)
			kill(getppid(), SIGTERM);	/* notify parent */
		exit(0);	/* and terminate; child can't return */
	}

		/* parent copies ptym to stdout */
	if (signal_intr(SIGTERM, sig_term) == SIG_ERR)
		err_sys("signal_intr error for SIGTERM");

	for ( ; ; ) {
		if ( (nread = read(ptym, buff, BUFFSIZE)) <= 0)
			break;		/* signal caught, error, or EOF */

		if (writen(STDOUT_FILENO, buff, nread) != nread)
			err_sys("writen error to stdout");
	}

	/* There are three ways to get here: sig_term() below caught the
	 * SIGTERM from the child, we read an EOF on the pty master (which
	 * means we have to signal the child to stop), or an error. */

	if (sigcaught == 0)	/* tell child if it didn't send us the signal */
		kill(child, SIGTERM);
	return;		/* parent returns to caller */
}

/* The child sends us a SIGTERM when it receives an EOF on
 * the pty slave or encounters a read() error. */

static void
sig_term(int signo)
{
	sigcaught = 1;		/* just set flag and return */
	return;				/* probably interrupts read() of ptym */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -