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

📄 example2-02.c

📁 Linux网络测试程序
💻 C
字号:
//实现管道双向传送的例子 #include	<stdio.h>#include	<unistd.h>#include	<dirent.h>#include	<limits.h>#define		bufflen		1024void server(), client();typedef int pid_t;int main(int argc, char **grav){	int   n, pipe1[2], pipe2[2];	pid_t childpid;		if (pipe(pipe1) < 0)		printf("pipe error\n");	if (pipe(pipe2) < 0)		printf("pipe error\n");	if ( (childpid = fork()) < 0)		exit(0);	if (childpid > 0) {		close(pipe1[0]);		close(pipe2[1]);		client(pipe2[0], pipe1[1]);		waitpid(childpid, NULL, 0);		exit(0);	}	else {		close(pipe1[1]);		close(pipe2[0]);		server(pipe1[0], pipe2[1]);		exit(0);	}}//-----------------------------------------------------------------------------void server(int readfd, int writefd){	ssize_t 	n;	char	    buff[bufflen], *ptr;	struct dirent	 *dirp;	DIR		    *dp;	if ( ( n = read(readfd, buff, bufflen) ) == 0)	/*read dirname form IPC channel*/		exit(0);	buff[n] = '\0';	/* null terminate */	ptr = buff + n;	if ((dp = opendir(buff)) == NULL)		snprintf(ptr, sizeof(buff) - n, ": not find.\n");	/* tell client error */	else {		while ( ( dirp = readdir(dp) ) != NULL) {			if (strcmp(dirp->d_name, ".") == 0 || 				strcmp(dirp->d_name, "..") == 0)	/* ignore . and .. directory */				continue;			strcpy(ptr, dirp->d_name);	/* copy the filename list to the pipe */			n = strlen(dirp->d_name);			ptr += n;			*ptr = ' ';			ptr++;		}		*ptr = '\0';	/* null terminate */	}	n = strlen(buff);	if ( ( write(writefd, buff, n) ) != n)		exit(0);	closedir(dp);}//-----------------------------------------------------------------------------void client(int readfd, int writefd){	size_t	len;	ssize_t	n;	char	  buff[bufflen];	fgets(buff, bufflen, stdin);		/* read pathname from the standard input */	len = strlen(buff);		/* 删除路径名结尾处的回车符 */if (buff[len-1] == '\n')		len--;	if ( ( write(writefd, buff, len) ) != len)		exit(0);		/* 循环从管道中读,直到读到内容为止 */	while ( (n = read(readfd, buff, bufflen) ) > 0)		if ( ( write(STDOUT_FILENO, buff, n) ) != n)			exit(0);	printf("\n");}

⌨️ 快捷键说明

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