实验四 Linux进程间通信—管道与信号

一、实验目的与任务

目的:了解掌握操作系统管道与信号的特点与功能,学会借助管道与信号的功能函数进行编程。

任务:利用C语言指令编写程序调用管道与信号函数,完成相应功能。

二、实验设备

装有Linux操作系统的计算机一台。

三、实验要求

1、实验内容与要求:

1)验证管道和命名管道函数功能。

2)利用信号进行进程间的通信。

2、实验安排方式:采用1人1组,上机在Linux系统下进行编程实验。

四、实验内容

1.创建1个子线程,利用管道实现父子间的通信,子线程写入自己的学号和姓名,父进程通过管道读取子进程写入的内容,并在父进程中输出读取的内容以及进程id。

实验四 Linux进程间通信—管道与信号_第1张图片

#include

#include

#include

#include

#include

#include

int main()

{

        int fd[2];

        int ret=pipe(fd);

        if(ret==-1)

        {

                perror("pipe");

                exit(1);

        }

        pid_t pid;

        pid=fork();

        if(pid==0)

        {

                close(fd[0]);

                char *p="542113430809ljh\n";

                write(fd[1],p,strlen(p)+1);

                close(fd[1]);

                wait(NULL);

        }

        else if(pid>0)

{

                            printf("pid:%d,ppd:%d\n",getpid(),getppid());

                close(fd[1]);

                char buf[64] = {0};

                ret=read(fd[0],buf,sizeof(buf));

                close(fd[0]);

                write(STDOUT_FILENO,buf,ret);

        }

        return 0;

}


2.创建2个进程,使用FIFO实现进程间通信,并对代码做出详细注释。
fifo_write.c

实验四 Linux进程间通信—管道与信号_第2张图片

fifo_read.c

实验四 Linux进程间通信—管道与信号_第3张图片

fifo_write.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 
int main(int argc,char *argv[])
{
        if(argc<2)
        {
                printf("./a.out fifoname\n");
                exit(1);
        }
        int ret=access(argv[1],F_OK);
        if(ret==-1)
        {
                int r=mkfifo(argv[1],0664);
                if(r==-1)
                {
                        perror("mkfifo");
                        exit(1);
                }
                else
                        printf("fifo creat success\n");

        }
        int fd=open(argv[1],O_WRONLY);
        while(1)
        {
                char *p="hello,world";
                write(fd,p,strlen(p)+1);
                sleep(1);
        }
        close(fd);
        return 0;
}
fifo_read.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 
int main(int argc,char *argv[])
{
        if(argc<2)	//判断是否传入了文件名
        {
                printf("./a.out fifoname\n");
                exit(1);
        }
        int ret=access(argv[1],F_OK);//判断文件是否存在
        if(ret==-1)			//如果文件不存在就创建文件
        {
                int r=mkfifo(argv[1],0664);
                if(r==-1)		//判断文件是否创建成功
                {

                        perror("mkfifo");
                        exit(1);
                }
                else
                        printf("fifo creat success\n");

        }
        int fd=open(argv[1],O_RDONLY);/打开文件
        if(fd==-1)			
        {
                perror("open");
                exit(1);
        }
        while(1)			//不断读取fifo中的数据并打印
        {
                char buf[1024]={0};
                read(fd,buf,sizeof(buf));
                printf("buf=%s\n",buf);
        }
        close(fd);			//关闭文件
        return 0;
}

五、分析总结

       通过这次实验,我了解掌握操作系统管道与信号的特点与功能,学会借助管道与信号的功能函数进行编程。并且能够利用C语言指令编写程序调用管道与信号函数,来完成相应功能。

关于管道(Pipe):我对使用管道进行进程间通信的实验心得是,管道是一种单向通信机制,适合用于具有父子关系的进程之间的通信。在实验中,我发现通过创建管道可以轻松地在两个相关的进程之间传递数据,例如一个进程可以将输出通过管道传递给另一个进程进行处理。但是,由于管道是单向的,如果需要双向通信,则需要创建两个管道。

关于信号(Signal):在使用信号进行进程间通信的实验中,我发现信号是一种轻量级的通信方式,适合用于在不同进程之间发送简单的通知或者事件。通过发送不同的信号,可以实现进程间的相互通知和控制。但是,信号的处理和使用需要小心,因为信号是异步的,可能会造成一些意想不到的情况,比如信号丢失或者产生竞争条件。

总的来说,管道适合用于进程之间的数据流通信,而信号适合用于进程之间的简单通知和控制。在实际的编程中,可以根据具体的需求选择合适的通信方式来实现进程间的通信。

你可能感兴趣的:(Linux实验,linux,运维,服务器)