Linux操作系统实验 ——无名管道通信

本文介绍了两个C语言实现的程序,分别展示了父子进程使用无名管道的通信以及同一进程树的兄弟进程间的通信。程序中用到了pipe函数、fork函数、lockf函数进行同步,并通过write和read进行数据传输。无名管道仅限于有血缘关系的进程通信,而有名管道可以跨进程树进行通信。
摘要由CSDN通过智能技术生成

实验目的:

        了解管道通信机制的基本原理

        掌握父子进程使用无名管道通讯的方法

实验内容:

#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<stdio.h>
#include<string.h>
int main(){
    int fd[2], pid, n;
    char outpipe[50], inpipe[50];
    memset(outpipe, 0 ,sizeof(outpipe));
    memset(inpipe, 0, sizeof(inpipe));
    pipe(fd);
    pid = fork();
    if(pid == 0){
        sprintf(outpipe, "I am child process");
        lockf(fd[1], 1, 0);//枷锁 
        write(fd[1], outpipe, strlen(outpipe)); 
        lockf(fd[1], 0, 0);//解说 
        printf("child process write %d bytes : %s\n", strlen(outpipe), outpipe);
    }else{
        wait(0);
        lockf(fd[0], 1, 0);
        n = read(fd[0], inpipe, 25);
        lockf(fd[0], 0, 0);
        printf("parent process %d read %d bytes: %s\n", getpid(), n, inpipe);
    }
    
}

 

 有名管道和无名管道的不同之处

        无名管道只允许由血缘关系的进程之间的通讯

        有名管道可以让没有w个进程之间进行通讯

同一进程树的兄弟进程通信程序

#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<stdio.h>
#include<string.h>
int mian() {
	int fd[2], pid, pir, n, i;
	char send[50] = "b", receive[50] = "b";
	pipe(fd);
	pid = fork();
	if(pid == 0){
		while(send[0] != 'a'){
			printf("Child1 inputs information from keyboard:\n");
			scanf("%s", send);
			lockf(fd[1], 1, 0);
			write(fd[1], send, strlen(send));
			lockf(fd[1], 0, 0);
			printf("Send :%s\n", send);
			sleep(1);
		}
	}else{
		pir = fork();
		if(pir == 0){
			while(receive[0] != 'a'){
				lockf(fd[0], 1, 0);
				n = read(fd[0], receive, 20);
				lockf(fd[0], 0, 0);
				printf("Child2 received :%s\n", receive);
				
			}
		}else{
			wait(0);
			wait(0);
			printf("parent is kill!\n");
		}
	}
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值