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

📄 procpipe.c

📁 xen虚拟机源代码安装包
💻 C
字号:
/* Written by Anthony Liguori <aliguori@us.ibm.com> */#include <stdio.h>#include <getopt.h>#include <errno.h>#include <stdlib.h>#include <err.h>#include <sys/types.h>#include <sys/wait.h>#include <unistd.h>#define PACKAGE_NAME "procpipe"#define PACKAGE_VERSION "0.0.1"#define GPL_SHORT \"This is free software; see the source for copying conditions.  There is NO\n"\"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."#define PACKAGE_BUGS "aliguori@us.ibm.com"#define PACKAGE_AUTHOR "Anthony Liguori"#define PACKAGE_OWNER "IBM, Corp."#define PACKAGE_LICENSE GPL_SHORTstatic void usage(const char *name){	printf("Usage: %s [OPTIONS]\n"	       "\n"	       "  -h, --help      display this help and exit\n"	       "  -V, --version   output version information and exit\n"	       "\n"	       "Report bugs to <%s>.\n"	       , name, PACKAGE_BUGS);}static void version(const char *name){	printf("%s (%s) %s\n"	       "Written by %s.\n"	       "\n"	       "Copyright (C) 2005 %s.\n"	       "%s\n"	       , name, PACKAGE_NAME, PACKAGE_VERSION,	       PACKAGE_AUTHOR, PACKAGE_OWNER, PACKAGE_LICENSE);}static pid_t exec(int stdout, int stdin, const char *cmd){	pid_t pid;	pid = fork();	if (pid == 0) {		close(STDOUT_FILENO);		dup2(stdout, STDOUT_FILENO);		close(STDIN_FILENO);		dup2(stdin, STDIN_FILENO);		execlp("/bin/sh", "sh", "-c", cmd, NULL);	}	return pid;}int main(int argc, char **argv){	int ch, opt_ind = 0;	const char *sopt = "hV";	struct option lopt[] = {		{ "help", 0, 0, 'h' },		{ "version", 0, 0, 'V' },		{ 0 }	};	int host_stdout[2];	int host_stdin[2];	int res;	pid_t pid1, pid2;	int status;	while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) {		switch (ch) {		case 'h':			usage(argv[0]);			exit(0);		case 'V':			version(argv[0]);			exit(0);		case '?':			errx(EINVAL, "Try `%s --help' for more information.",			     argv[0]);		}	}	if ((argc - optind) != 2) {		errx(EINVAL, "Two commands are required.\n"		     "Try `%s --help' for more information.", argv[0]);	}	res = pipe(host_stdout);	if (res == -1) {		err(errno, "pipe() failed");	}	res = pipe(host_stdin);	if (res == -1) {		err(errno, "pipe() failed");	}	pid1 = exec(host_stdout[1], host_stdin[0], argv[optind]);	if (pid1 == -1) {		err(errno, "exec(%s)", argv[optind]);	}	pid2 = exec(host_stdin[1], host_stdout[0], argv[optind + 1]);	if (pid2 == -1) {		err(errno, "exec(%s)", argv[optind + 1]);	}	waitpid(pid1, &status, 0);	if (WIFEXITED(status)) status = WEXITSTATUS(status);	if (status != 0) {		printf("Child exited with status %d\n", status);	}	waitpid(pid2, &status, 0);	if (WIFEXITED(status)) status = WEXITSTATUS(status);	if (status != 0) {		printf("Child2 exited with status %d\n", status);	}	return 0;}

⌨️ 快捷键说明

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