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

📄 example22.c

📁 LinuxNetProgramming Linux网络编程基础实例
💻 C
字号:
#include	<stdio.h>

#include	<unistd.h>

#include	<dirent.h>

#include	<limits.h>



#define		bufflen		1024

void 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 + -