linux进程间通信(IPC)与控制---管道

进程有独立的用户内存地址,

进程的全局变量对其它进程透明,

需通过内核缓冲内共享数据,通信


管道: 声明在unistd.h头文件中

原型 int pipe(int filedes[2]);  filedes[0]表示输入管道,filedes[1]表示输出管道. 返回值:0表示创建管道成功,-1为失败/

代码测试:

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc,char* argv[])
{
	int fd[2];
	pipe(fd);//创建管道
	pid_t pid = fork();//生成子进程
	if(pid < 0){
	perror("fork failed");
	exit(1);
	}
	else if( pid >0){
	close(fd[0]);//父进程关闭输入管道
	write(fd[1],"hello child\n",12);//子进1向输出管道写入数据
	wait(NULL);
	}else{
	close(fd[1]);//子进程关闭输出管道
	char buf[50];
	read(fd[0],buf,12);
	//printf("%s",buf);
	write(STDOUT_FILENO,buf,12);//此处也可以用dup2,将信息输出到终端
		}
	return 0;
}

  如果想让子进程作为输出,父进程作为输出,可以使用wait(NULL) /wait(pid.....)让父进程处于阻塞状态,直到子进程完成输出.父     进程接收到signal后苏醒进行读取.在这里我没有过多的考虑PV操作了,可能会存在一些同步的问题,以后会进一步完善.

 

两个子进程间通信也是差不多的.

代码:

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc,char* argv[])
{
	int fd[2];
	pipe(fd);
	pid_t pid = fork();
	if(pid < 0){
	perror("fork failed");
	exit(1);
	}
	else if( pid >0){
	pid_t pidt = fork();
	if(pidt == 0){
	close(fd[0]);
	write(fd[1],"hello borther\n",14);
	}
	}else{
	close(fd[1]);
	char buf[50];
	read(fd[0],buf,14);
	//printf("%s",buf);
	write(STDOUT_FILENO,buf,12);
		}
	return 0;
}
 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值