进程间的通信之管道

本文介绍了进程间通信的主要方法,包括管道、套接字、共享内存、信号和信号量等,并详细解释了有名管道和无名管道的区别及应用场景,还提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程之间的通信,管道,套接字,共享内存,信号,信号量等。

套接字适用范围很广,用于两个主机之间的两个进程的通信,一台主机的两个进程也可以进行通信,例如数据库,与数据库建立连接通信就是和数据库进行socket通信。

信号,如kill向进程发送信号,在linux下向进程发松9号信号用于杀死进程kill -9 pid

信号量,用于控制进程的同步,使得整个进程间前向推进

共享内存,共享的是物理内存,两个进程通过地址映射,映射到相同的一块地址空间。

管道分为有名管道和无名管道,有名管道类似于建立一个文件使得任意两进程之间可以进行通信。而无名管道的生存依赖与进程的生命周期,无名管道的适用面小于有名管道,只适用与有亲缘关系的进程,比如通过fork()函数产生的进程,父进程子进程等等

通过有名管道两个进程之间相互通信

读取管道中信息的进程:
int main()
{
	int fr = open("./pipefile", O_RDONLY);//在建立的管道中读取数据,打开方式类似于文件,以只读方式打开
	assert(fr != -1);
	char buf[128] = {0};
	while(1)
	{
		int num = read(fr, buf, 128); 
		if (num == 0 || !(strncmp(buf, "exit", 4)))
		{	
			exit(0);
		}
		printf("%s", buf);
        memset(buf, 0, 128);
	}
	return 0;
}


为管道发送信息的进程:

int main()
{
	int fdw = open("./pipefile", O_WRONLY);
	assert(fdw != NULL);
	
	char buf[128] = {0};
	while(1)
	{	
		fgets(buf, 128, stdin);//从标准输入读取数据
		int n = write(fdw, buf, 128);//将数据写到有名管道中
		buf[strlen(buf)-1] = 0;
		if (!(strcmp(buf, "exit")))
		{
			printf("jieshu");
			exit(0);
		}
		memset(buf,0,128);
	}
	return 0;
}

在Linux下,建立管道的命令:mkfifo 管道名,还有建立管道的函数mkfifo可提供程序建立管道

无名管道用于进程间的通信:

int main()
{
	int fd[2];
	assert(pipe(fd) != -1);//无名管道的创建,获得两个整形变量,fd[0]用来向管道中读数据,fd[1]向管道中写入数据
	pid_t pid = fork();
	assert( pid != -1);
	if (pid == 0) //子进程从其中读数据
	{
		close(fd[1]);//屏蔽掉了写入操作
		char buff[128] = {0};
		read(fd[0], buff, 127);
		printf("the child is %s\n", buff);
		close(fd[0]);
	}	
	else//父进程从其中写数据
	{
		close(fd[0]);//屏蔽掉了读入操作
		printf("input: ");
		
		char buff[128] = {0};
		fgets(buff, 127, stdin);
		
		write(fd[1], buff, strlen(buff));
		close(fd[1]);
	}
	exit(0);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值