进程间通信2管道

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*1.一般来说子进程和父进程通信至少需要两条管道 一条用于读,一条用于写*/
/*2.两个进程得共享资源都不是同一个,一般来说子进程产生得时候会将所有得资源拷贝一份供子进程使用,
  所以父进程和子进程得资源不是同一份*/
/*3.如果写端的管道关闭之后,那么读端的就不会阻塞了,就会继续执行下面的代码*/
/*4.如果读端的管道关闭之后,那么写端的管道会产生信号SIGPIPE*/
int main(void) 
{
    
    
	int fd[2];//管道得句柄//读写操作读为fd【0】 写为fd【1】不要搞混 否则会出现莫名得错误
	int ret;
	char buff1[1024];//读写操作
	char buff2[1024];//读写操作
	pid_t pd;

	ret = pipe(fd);//创建管道
	if (ret !=0) //创建失败
	{
    
    
		printf("create pipe failed!\n");
		exit(1);
	}

	pd = fork();//创建子进程
	if (pd == -1) 
	{
    
    
		printf("fork error!\n");
		exit(1);
	} 
	else if (pd == 0)//子进程创建成功 
	{
    
    
		bzero(buff2, sizeof(buff2));//清空字符数组
		read(fd[0], buff2, sizeof(buff2));//子进程进行读操作
		printf("process(%d) received information:%s\n", getpid(), buff2);
	} 
	else //父进程执行得代码
	{
    
    
		strcpy(buff1, "Hello!");
		write(fd[1], buff1, strlen(buff1)); //父进程进行写操作
		printf("process(%d) send information:%s\n", getpid(), buff1);
	}

	if (pd > 0) //父进程等待子进程
	{
    
    
		wait();//父进程等待子进程
	}
	
	return 0;	
}

demo将管道作为标准输入输出

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void) 
{
    
    
	int fd[2];
	int ret;
	char buff1[1024];
	char buff2[1024];
	pid_t pd;

	ret = pipe(fd);//创建管道 当子进程创建时会重新复制一条管道
	if (ret !=0) {
    
    
		printf("create pipe failed!\n");
		exit(1);
	}

	pd = fork();
	if (pd == -1) {
    
    
		printf("fork error!\n");
		exit(1);
	} else if (pd == 0) //这时子进程里有两条管道分别是读端和写端
	{
    
    
		//bzero(buff2, sizeof(buff2));
		//sprintf(buff2, "%d", fd[0]);
		close(fd[1]);//关闭写端

		close(0);//关闭标准输入
		dup(fd[0]);//复制一份读端得fd
		close(fd[0]);//关闭复制的读端fd
		
		execlp("./od.exe", "./od.exe", "-c", 0);//子进程执行另一个当前目录下的od.exe程序
		printf("execl error!\n");
		exit(1);
	} else {
    
    
		close(fd[0]);//父进程关闭读端的fd
	
		strcpy(buff1, "Hello!");
		write(fd[1], buff1, strlen(buff1)); 父进程写入数据

		close(fd[1]);
	}
	
	return 0;	
}

od.exe

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    
           int ret = 0;
        char buff[80] = {
    
    0,};

        ret = scanf("%s", buff);
        printf("[ret: %d]buff=%s\n", ret, buff);

        ret = scanf("%s", buff);//这里第二次读取输入时会失败
        printf("[ret: %d]buff=%s\n", ret, buff);
        return 0;
}

Linux一切皆文件 使用popen/pclose

popen的作用:
用来在两个程序之间传递数据:
在程序A中使用popen调用程序B时,有两种用法:
程序A读取程序B的输出(使用fread读取)
程序A发送数据给程序B,以作为程序B的标准输入。(使用fwrite写入)

用法:man  popen
返回值:成功,返回FILE*
        失败, 返回空

#include <stdio.h>
#include <stdlib.h>

#define BUFF_SIZE   1024

int main(void)
{
    
    
	FILE * file;//文件指针
	char buff[BUFF_SIZE+1];
	int cnt;

	// system("ls -l > result.txt");
	file = popen("ls -l", "r");//打开这个程序或文件,读的方式读取 ls -l 这个程序
	if (!file) {
    
    
		printf("fopen failed!\n");
		exit(1);
	}

	cnt = fread(buff, sizeof(char), BUFF_SIZE, file);//读到buff
	if (cnt > 0) {
    
    
		buff[cnt] = '\0';
		printf("%s", buff);
	}	

	pclose(file);//关闭这个文件

	return 0;	
}

在这个程序将字符写到另一程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFF_SIZE   1024

int main(void)
{
    
    
	FILE * file;
	char buff[BUFF_SIZE+1];
	int cnt;

	file = popen("./p2", "w");//当前文件下的p2程序
	if (!file) {
    
    
		printf("fopen failed!\n");
		exit(1);
	}

	strcpy(buff, "hello world!");
	cnt = fwrite(buff, sizeof(char), strlen(buff), file);//写到p2的程序
	
	pclose(file);

	return 0;	
}

猜你喜欢

转载自blog.csdn.net/qq_45743563/article/details/113807783
今日推荐