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

📄 test11_8.txt

📁 人民邮电出版社的经典著作《Linux下的C编程》配套源码!初学者的必备!共14章
💻 TXT
字号:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdarg.h>
#include <fcntl.h>

void parent(char *argv[ ]);
void child(char *argv[ ]);
int write_buffer(int fd, const void *buf, int count);
int read_buffer(int fd, void *buf, int count);
int readnlstring(int socket, char *buf, int maxlen, char delim);

int main(int argc, char *argv[ ])
{
    	if(argc<2)
        	parent(argv);
    	else
        	child(argv);

    	return 0;
}


void parent(char *argv[ ])
{
    	char buffer[100];
	int fd;

	close(0);

	if(mkfifo("my-fifo",0600)==-1)
	{
		printf("error, failed to creat my-fifo!\n");
		exit(254);
    	}
    	printf("the server is listening on my-fifo.\n");

    	if(fd=open("my-fifo", O_RDONLY)==-1)
    	{
		printf("error, failed to open my-fifo!\n");
		exit(254);
    	}

	printf("Client has connected. \n");

	while(readnlstring(fd, buffer, sizeof(buffer),0)>=0)
	{
    		printf("received message: %s \n", buffer);
	}
	printf("No more data; parent exiting. \n");
	if(close(fd)==-1)
	{
    		printf("error, close failed!");
    		exit(254);
	}
	unlink("my-fifo");
}


void child(char *argv[ ])
{
    	int fd;
    	char buffer[100];

  	if(fd=open("my-fifo", O_WRONLY)==-1)
  	{
		printf("error, failed to open my-fifo!\n");
		exit(254);
    	}
    
    	printf("The client is ready. Enter messages, or Ctrl+D when done. \n");

    	while(fgets(buffer, sizeof(buffer), stdin)!=NULL)
    	{
        	write_buffer(fd, buffer, strlen(buffer));
    	}	
    	printf("client exiting. \n");
	if(close(fd)==-1)
	{
  		printf("error, close failed!");
  		exit(254);
	}
}


int write_buffer(int fd, const void *buf, int count)
{
    	const void *pts=buf;
    	int status=0, n;

    	if(count<0)
	return(-1);
	while(status!=count)
	{
      		if(n=write(fd, pts+status,count-status)==-1)
      		{
           		printf("error, failed to write! \n");
           		exit(254);
       		}
       		else if(n<0)       
           		return (n);
        	status+=n;
    	}
	return(status);
}


int read_buffer(int fd, void *buf, int count)
{
    	void *pts=buf;
    	int status=0, n;

    	if(count<0)
	return(-1);
	while(status!=count)
	{
      		if(n=read(fd, pts+status,count-status)==-1)
      		{
           		printf("error, failed to write! \n");
           		exit(254);
       		}
       		else if(n<0)       
           		return (n);
        	status+=n;
    	}
	return(status);
}


int readnlstring(int socket, char *buf, int maxlen, char delim)
{
    	int status;
	int count=0;

	while(count<maxlen-1)
	{
    		if((status=read_buffer(socket, buf, 1))<1)
    		{
        		return -1;
    		}
    		if(buf[count]==delim)
    		{
        		buf[count]=0;
        		return 0;
    		}
    		count++;
	}
	buf[count]=0;
	return 0;
}

⌨️ 快捷键说明

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