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

📄 tpipe.c

📁 su 的源代码库
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       */#include	"sftest.h"#include	<signal.h>#if __STD_Cvoid alrmf(int sig)#elsevoid alrmf(sig)int	sig;#endif{	terror("Blocking somewhere until alarm went off\n");}MAIN(){	int	fd[2];	Sfio_t	*fr, *fw;	char	*s;	int	i, j, n;	char	buf[1024];	if(sfnew(sfstdout,buf,sizeof(buf),SF_UNBOUND,SF_STRING|SF_WRITE) != sfstdout)		terror("Reopen sfstdout\n");	if(pipe(fd) < 0)		terror("Can't open pipe\n");	if(!(fr = sfnew(NIL(Sfio_t*),NIL(Void_t*),(size_t)SF_UNBOUND,fd[0],SF_READ)) ||	   !(fw = sfnew(NIL(Sfio_t*),NIL(Void_t*),(size_t)SF_UNBOUND,fd[1],SF_WRITE)) )		terror("Can't open stream\n");	signal(SIGALRM,alrmf);	sfwrite(fw,"0123456789",10);	alarm(4);	if(sfread(fr,buf,10) != 10)		terror("Can't read data from pipe\n");	sfwrite(fw,"0123456789",10);	if(sfmove(fr,fw,(Sfoff_t)10,-1) != 10)		terror("sfmove failed\n");	alarm(0);	sfpurge(fw);	sfclose(fw);	sfpurge(fr);	sfclose(fr);	if(pipe(fd) < 0)		terror("Can't open pipe2\n");	if(!(fr = sfnew(NIL(Sfio_t*),NIL(Void_t*),(size_t)SF_UNBOUND,fd[0],SF_READ)) ||	   !(fw = sfnew(NIL(Sfio_t*),NIL(Void_t*),(size_t)SF_UNBOUND,fd[1],SF_WRITE)) )		terror("Can't open stream\n");	sfset(fr,SF_SHARE|SF_LINE,1);	sfset(fw,SF_SHARE,1);	if(sfwrite(fw,"1\n2\n3\n",6) != 6)		terror("sfwrite failed0\n");	i = j = -1;	if(sfscanf(fr,"%d%d\n%n",&i,&j,&n) != 2 || i != 1 || j != 2 || n != 4)		terror("sfscanf failed0\n");		if(sfscanf(fr,"%d\n%n",&i,&n) != 1 || i != 3 || n != 2)		terror("sfscanf failed1\n");	if(sfwrite(fw,"123\n",4) != 4)		terror("sfwrite failed\n");	if(!(s = sfreserve(fr,4,0)) )		terror("sfreserve failed\n");	sfputr(fw,"abc",'\n');	if(sfmove(fr,fw,(Sfoff_t)1,'\n') != 1)		terror("sfmove failed\n");	if(!(s = sfgetr(fr,'\n',1)) || strcmp(s,"abc") != 0)		terror("sfgetr failed\n");	if(sfwrite(fw,"111\n222\n333\n444\n",16) != 16)		terror("Bad write to pipe\n");	if(!(s = sfgetr(fr,'\n',1)) )		terror("sfgetr failed\n");	if(strcmp(s,"111") != 0)		terror("sfgetr got wrong string\n");	if(sfmove(fr,sfstdout,(Sfoff_t)2,'\n') != 2)		terror("sfmove failed2\n");	sfputc(sfstdout,0);	if(strcmp("222\n333\n",buf) != 0)		terror("sfmove got wrong data\n");	if(sfmove(fr,NIL(Sfio_t*),(Sfoff_t)1,'\n') != 1)		terror("sfmove failed\n");	if(sfwrite(fw,"0123456789",11) != 11)		terror("Bad write to pipe2\n");	if(!(s = sfreserve(fr,11,0)) )		terror("Bad peek size %d, expect 11\n",sfvalue(fr));	if(strncmp(s,"0123456789",10) != 0)		terror("Bad peek str %s\n",s);	/* test for handling pipe error */	if(pipe(fd) < 0)		terror("Can't create pipe");	close(fd[0]);	if(!(fw = sfnew(NIL(Sfio_t*),NIL(Void_t*),sizeof(buf),fd[1],SF_WRITE)) )		terror("Can't open stream");	signal(SIGPIPE,SIG_IGN); /* avoid dying by sigpipe */	for(i = 0; i < sizeof(buf); ++i)		buf[i] = 'a';	buf[sizeof(buf)-1] = 0;	for(i = 0; i < 3; ++i)	{	signal(SIGALRM,alrmf); /* do this to avoid infinite loop */		alarm(4);		sfprintf(fw, "%s\n", buf); /* this should not block */		alarm(0);	}	TSTEXIT(0);}

⌨️ 快捷键说明

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