Linux程序设计硬核(管道pipe、创建进程fork)_客户\服务器架构

  1.  管道的定义
  2. 进程管道
  3. 管道调用
  4. 父进程子进程
  5. 命名管道;FIFO,LIFO
  6. 客户\服务器架构

从一个进程连接数据流到另外一个进程时,我们使用术语管道(pipe)。比如shell中的

cmd1 | cmd2

其实最简单的两个程序之间的传递数据的方法就是使用popen pclose函数,原型如下

#include <stdio.h>

FILE *popen(const char *command,cosnt char *open_mode);
int pclose(FILE *stream_to_close); 

 这里大家就可以man一下了。我就不详细说明了

 

 

 

 

/
//
//   CopyRight ©  Peace & Love 2019.3.29
//   Option:descripte the pipe usage
//   Autor:Lai Sky
//   Email:zixing_sky@163.com
//	 
/

#include <unistd.h>
//int pipe(int file_descriptor[2]);
//通过这个函数在两个程序之间传递数据不需要启动一个shell来解释请求的命令
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
	int data_processed;
	int file_pipes[2];
	const char some_data[] = "123";
	char buffer[BUFSIZ + 1];
	
	memset(buffer,'\0',sizeof(buffer));
	/* 
		如果EMFILE:进程使用的文件描述符过多
		    ENFILE:系统的文件表已满
		    EFAULT:文件描述符无效
		  成功返回0;
		两个返回的文件描述符以一种特殊的方式连接起来。写到file_descriptor[1]的所有数据都可以从[0]读回来。因为时间基于先进先出原则(FIFO)进行处理。栈采用后进先出原则,通常是LIFO;
	*/
	if(pipe(file_pipe) == 0)
	{
		data_processed = write(file_pipes[1],some_data,strlen(some_data));
		printf("Wrote %d bytes\n",data_processed);
		data_processed = read(file_pipes[0],buffer,BUFSIZ);
		exit(EXIT_SUCCESS);
	}
	exit(EXIT_FAILURE);
	
}


//调用fork()来调用pipe()
//about fork
//https://www.cnblogs.com/dongguolei/p/8086346.html
int fork_pipe()
{
	int data_processed;
	int file_pipe[2];
	const char some_data[] = "123";
	char buffer[BUFSIZ + 1];
	pid_t fork_result;
	
	memset(buffer,'\0',sizeof(buffer));
	
	if(pipe(file_pipes) == 0)
	{
		fork_result = fork();
		if(fork_result == -1)
		{
			fprintf(stderr,"Fork failure");
			exit(EXIT_FAILURE);
		}
		if(fork_result == 0) {
		data_processed = read {file_pipes[0],buffer,BUFSIZ};
		printf("Read %d bytes:%s\n",data_processed,buffer);
		exit(EXIT_SUCCESS);
		}else {
			data_processed = write(file_pipes[1],some_data,strlen(some_data));
			printf("Wrote %d bytes\n",data_processed);
		}
				
	}
	exit(EXIT_SUCCESS);

}
//help:这个程序首先用pipe调用创建一个管道,接着用fork调用创建一个新进程,如果调用成功,父进程就写数据到管道中,而子进程从管道中读取数据。父进程都在只调用一次write或者read之后就退出。如果父进程在子进程之前退出,就会在两部分输出内容之间看到shell提示符$




 调用fork之后的情况

 

 程序做好数据传输准备之后的情况

 

命名管道:FIFO

命名管道是一种特殊的类型文件,在文件系统中以文件名的形式存在。可以使用命令行上创建命名管道,也可以在程序中创建它。

mknod filename p

或者

mkfifo filename (推荐使用这个)

包含头文件

#include <sys/types.h>

#include <sys/stat.h>

int main()

{
    int res = mkfifo("/tmp/my_fifo",0777);
    if(res == 0) printf("fifo created!!\n");
    exit(EXIT_SUCCESS);

}

然后执行程序

ls -lF /tmp/my_fifo

prxwr-xr-x 1 rick users 0 2019-3-29-16:30 /tmp/my_fifo |

输出的第一个字母就是管道p

之后就可以访问管道了

cat < /tmp/my_fifo

echo "hello sky" > /tmp/my_fifo

注意:cat命令一直被挂起,直到ctrl+c中断它或者读到信息

就可以看到输出

突然看到通知说明天要开题。哈哈哈改成周日了,开心出游

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值