代码中创建新终端 以及的把新终端的输出打印到文件,用于调式。

转自:http://blog.chinaunix.net/uid-20682147-id-4981769.html
cat term.c
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>
#include<sys/prctl.h>
#include<unistd.h>
#include<utmp.h>
#include<signal.h>
#include<pty.h>
#include<fcntl.h>

static void on_signal(int signo)
{
	printf("[%d] signal: %s \n", getpid(), strsignal(signo) );
}

int main()
{
	int amaster = 0;
	char name[100];
	struct termios termp;    //termios.h (bits/termios.h)
	struct winsize winp;     //term.h (bits/ioctl-types.h)
	pid_t pid = forkpty(&amaster, name, &termp, &winp);
	if (pid < 0) {
		perror("forkpty");
		exit(1);
	}
	else if (0 == pid) {
		//子进程属于新终端
		//子进程的printf()在父进程的终端上看不见
		//父进程被中断或挂掉会向子进程发送sighup
		signal(SIGHUP, on_signal);
		printf("child: %d \n", getpid());
		int save_fd = dup(STDOUT_FILENO);
		int fd = open("1.txt", (O_RDWR |O_CREAT), 0644);
		dup2(fd,STDOUT_FILENO);
		while (true) {
			sleep(1);
			printf("sub process printf!!!\n");

		}
		exit(0);
	}
	else if (pid > 0) {
		//父进程使用之前终端
		//如果中断会向进程发送SIGHUP
		printf("pid: %d/%d\n", getpid(), pid);
		printf("name: %s\n", name);
		printf("amaster: %d\n", amaster);
		printf("win.row: %d\n", winp.ws_row);
		printf("win.col: %d\n", winp.ws_col);
		printf("win.xpixel: %d\n", winp.ws_xpixel);
		printf("win.ypixel: %d\n", winp.ws_ypixel);
		getchar();
	}

	return 0;
}

gcc term.c -o term -lutil

tail -f  1.txt
sub process printf!!!
sub process printf!!!
sub process printf!!!
sub process printf!!!
sub process printf!!!
sub process printf!!!
sub process printf!!!
sub process printf!!!
sub process printf!!!
[6598] signal: Hangup 
sub process printf!!!
sub process printf!!!
sub process printf!!!

转自:http://blog.csdn.net/wangxvfeng101/article/details/11558697

方法1:
     #include <stdlib.h>
     #include <stdio.h>
     #include <unistd.h>
     #include <sys/stat.h>
     #include <fcntl.h>  

     int main()
     {
         fflush(stdout);
         setvbuf(stdout,NULL,_IONBF,0);
         printf("test stdout\n");
         int save_fd = dup(STDOUT_FILENO); // 保存标准输出 文件描述符 注:这里一定要用 dup 复制一个文件描述符. 不要用 = 就像是Winodws下的句柄.
         int fd = open("test1.txt",(O_RDWR | O_CREAT), 0644);
         dup2(fd,STDOUT_FILENO); // 用我们新打开的文件描述符替换掉 标准输出
         printf("test file\n");  

         //再恢复回来标准输出. 两种方式
         //方法1 有保存 标准输出的情况
         //dup2(save_fd,STDOUT_FILENO);  

         //方法2 没有保存 标准输出的情况
          int ttyfd = open("/dev/tty",(O_RDWR), 0644);
         dup2(ttyfd,STDOUT_FILENO);
         printf("test tty\n");
     }  

     方法2:
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>   

     int main()
     {
         fflush(stdout);
         setvbuf(stdout,NULL,_IONBF,0);
         printf("test stdout\n");
         freopen("test1.txt","w",stdout); //注: 不要使用这类的代码 stdout = fopen("test1.txt","w");   这样的话输出很诡异的. 最好使用  freopen 这类的函数来替换它.
         printf("test file\n");
         freopen("/dev/tty","w",stdout);
         printf("test tty\n");
     }
  1. 到这里我们就可以轻松解决 prinft  不输出到屏幕的问题了.
  2. 不外乎两种情况.
  3. 第1 标准输出被重定向了.
  4. 第2 输出缓冲区的问题. 就是 我们上两例中 开头的两行代码了.
  5. fflush(stdout); //  刷新一下缓冲区 让它马上输出.  在printf 之后调用它,就会马上输出了.
  6. setvbuf(stdout,NULL,_IONBF,0); //如果你嫌上个方法麻烦, 就使用这个函数. 直接将缓冲区禁止了. 它就直接输出了.
  7. 这两个函数都是有关流缓冲区的. 具体使用和说明网上有很多.   我只说一下什么是流缓冲区, 是做什么用的.  操作系统为减少 IO操作 所以设置了缓冲区.  等缓冲区满了再去操作IO. 这样是为了提高效率.
时间: 2024-08-03 01:16:47

代码中创建新终端 以及的把新终端的输出打印到文件,用于调式。的相关文章

WPF在代码中创建DataTemplate时候的异常

今天写段程序用到了在代码中手动创建DataTemplate, var factory = new FrameworkElementFactory(typeof(OperationColumn));    returnnewDataTemplate() { VisualTree = factory }; 运行的时候出现如下异常: FrameworkElementFactory 必须位于此操作的密封模板中. 在 System.Windows.FrameworkElementFactory.Insta

本地C代码中创建Java对象

创建Java域的对象就是创建Java类的实例,再调用Java类的构造方法. 以Bitmap的构建为例,Bitmap中并没有Java对象创建的代码及外部能访问的构造方法,所以它的实例化必然是在JNI的c中实现的. BitmapFactory.java中提供了得到Bitmap的方法,时序简化为: BitmapFactory.java ->BitmapFactory.cpp -> GraphicsJNI::createBitmap()  [graphics.cpp] GraphicsJNI::cre

unity 在代码中创建spine动画组件

项目中用到了spine动画,使用Assetbundle打包后,在手机上运行会出现丢材质的情况.如果不进行打包,直接放到Resources目录下是可以正常加载的,但是,这样包就会很大,而且也不能进行热更新.进过测试,发现在代码中创建spine组件是可以解决这个问题,于是就有了下面的方案. 我们先说方案,再说问题. 方案: spine动画制作人员提供的spine动画三个文件分别是.json,.atlas,.png,把这三个文件放到unity(我用的unity版本是5.3.4f1)中,会自动生成atl

Android OpenGL ES(六)----进入三维在代码中创建投影矩阵和旋转矩阵

我们现在准备好在代码中添加透视投影了.Android的Matrix类为它准备了两个方法------frustumM()和perspectiveM().不幸的是,frustumM()的个缺陷,它会影响某些类型的投影,而perspectiveM()只是从Android的ICS版本开始才被引入,在早期的Android版本里并没有这个方法.我们可以简单地支持ICS及其以上的版本,但是这样会丢掉很大一部分市场,一些用户依然运行早期的Android版本. 作为替代,我们可以创建我们自己的方法来实现投影矩阵.

在代码中创建布局的方法

第一种imageView = new ImageView(this);FrameLayout decorView = (FrameLayout) getWindow().getDecorView();decorView.addView(imageView);FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) imageView.getLayoutParams();layoutParams.width = DubDi

二十二、SAP中创建一个内表,并添加内容循环输出显示

一.直接上代码 二.输出如下 原文地址:https://www.cnblogs.com/tianpan2019/p/11204285.html

iOS 自动布局扩展应用:代码中动态调整布局常量

一.设计需求 iOS Storyboard 自动布局技术,是iOS 6才出来的新技术,相当于多屏幕分辩率下自适应的技术. 但是一些复杂情况还是难处理. 比如有一个界面需求,进度条上显示标签,这个需求不难,难的是显要在显示表格框内,在各种机型显示正常. 最初设定是垂直居中向上偏15个像素 这是iPhone 4S 显示效果,下面与滑块还有错位 但是在iPhone 6下显示,下面有错位,但是上面留空太多 但如果把偏移量设为21.则出现另一种情况. 大屏幕的手机显示完美. 但是iPhone 4S下就错位

[翻译] DTCoreText 从HTML文档中创建富文本

DTCoreText 从HTML文档中创建富文本 https://github.com/Cocoanetics/DTCoreText 注意哦亲,DTRichTextEditor 这个组件是收费的,不贵,才650美元而已^_^. DTCoreText This project aims to duplicate the methods present on Mac OSX which allow creation of NSAttributedString from HTML code on iO

Cocos2d-x中创建SQLite数据库

我们下边介绍如何通过SQLite3提供的API实现MyNotes数据库创建.创建数据库一般需要经过如下三个步骤.(1) 使用sqlite3_open函数打开数据库.(2) 使用sqlite3_exec函数执行Create Table语句,创建数据库表.(3) 使用sqlite3_close函数释放资源.在这个过程中,我们使用了三个SQLite3 API函数,它们都是纯C语言函数.在Cocos2d-x中通过C++调用C函数当然不是什么问题,NoteDAO.cpp中的NoteDAO::initDB(