实验1-进程控制

实验1-进程控制

编写程序,演示多进程并发执行和进程软中断、管道通信。

(1)  父进程使用系统调用pipe( )建立一个管道,然后使用系统调用fork()创建两个子进程,子进程1和子进程2;

(2)  子进程1每隔1秒通过管道向子进程2发送数据: I send you x times. (x初值为1,每次发送后做加一操作)

(3)  子进程2从管道读出信息,并显示在屏幕上;

(4)  父进程用系统调用signal()捕捉来自键盘的中断信号(即按Ctrl+C键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:

     Child Process l is Killed by Parent!

     Child Process 2 is Killed by Parent!

(5)  父进程等待两个子进程终止后,释放管道并输出如下的信息后终止

     Parent Process is Killed!

源码下载

(1)思路:

  按照实验内容,我们需要用父进程创建两个子进程,从而实现子进程之间通过管道(除此之外,还有mmap,fifo通信方式)来实现进程间通信。所以我们需要首先创建出两个子进程(这里注意fork函数使用的时候,避免子进程再创建出新的子子进程的问题,这样可能会导致整个程序退出的时候出现孤儿进程)。具体的进程通信步骤会在下面说明,还有就是Linux下信号的使用,父进程接受到来自键盘的中断信号(我们可以在终端输入kill -l来查看不同的类型)的时候,父进程捕获信号,然后想子进程发出kill信号。

(2)实现代码:

    int fd[2];//fd[0] 读端 fd[1] 写端
    int ret = pipe(fd);

 

  这里是首先创建两个文件描述符,一个是读端(创建出的子进程中的一个来操作读端),一个是写端(另一个子进程操作写端);然后创建一个管道,参数就是我们刚刚创建的文件描述符。

    for(; i<number; ++i) {//循环创建两个字线程
        pid_t pid = fork();
        if(pid == 0) {
            break; 
        }//防止出现子进程再创建出进程
    }

 

  这里我是循环创建了两个子进程,并且在循环体内部需要判断我的是否是子进程想要再创建子进程(这里可以尝试不加if判断,然后在终端下用ps命令查看是不是只创建了3个进程)

signal(SIGINT,func0);

 

  这里我们在父进程中添加捕获ctrl+c信号的signal函数,捕获到之后执行func0函数,想子进程发送kill信号

  下面是父子进程具体需要执行的内容:

  父进程:

     close(fd[0]);//父进程需要关闭pipe的读端和写端
        close(fd[1]);
        pid_t wpid;
        //阻塞等待子进程执行完毕回收子进程资源
        while( (wpid = waitpid(-1, NULL, WNOHANG)) != -1) {
            if(wpid == 0) {
                continue;
            }
        }

 

  写端子进程:

        int x = 1;
        signal(SIGINT,SIG_IGN);
        signal(2,func1);
        while (1) {
            //子进程1每经过1s向子进程2发送数据
            sleep(1);
            //向子进程2写入数据 关闭读端
            close(fd[0]);
            char p[64];
            sprintf(p,"I send you %d times.\n",x);
               write(fd[1], p, sizeof(p));
            x++;
        }
        
        close(fd[1]); 

 

  读端子进程:

        close(fd[1]);//从管道读出数据 关闭写端
        signal(SIGINT,SIG_IGN);
        signal(2,func2);
        while(1) {
            
            char buf[1024];
            read(fd[0], buf, sizeof(buf));
            printf("%s", buf);
            
        }
        close(fd[0]);   

 

(4)实验结果

 

posted @ 2018-12-05 10:59 风沙迷了眼 阅读( ...) 评论( ...) 编辑 收藏
实验3 进程的管理 一、实验内容 实验一  编写代码,实现以下功能:  打印当前所有环境变量的值;  添加新的环境变量NEWENV=first;  修改环境变量NEWENV的值为second;  打印环境变量NEWENV的值。 实验二  编写代码实现以下功能:  1.打印字符串“hello world!”  2.在打印字符串“hello world!”前调用三次fork,分析打印结果。 实验三  创建子进程  1.在子进程打开文件file1,写入自己的“班级_姓名_学号”,  2.进程读取file1的内容,并且打印显示。  3.在进程获取已经结束的子进程的状态信息,打印该信息,并且打印结束的子进程进程号。 实验四  编写程序实现以下功能:  1,在进程定义变量n,在子进程对变量n进行++操作;并且打印变量n的值,打印子进程pid;  2,在进程打印变量n的值,并且打印进程pid。  3,要求分别用fork和vfork创建子进程实验五  创建子进程一,在子进程递归打印/home目录的内容(用exec系列函数调用第二次实验的代码完成此功能);  1.子进程结束的时候完成以下功能:  打印字符串“Child process exited!”  打印子进程标识符,打印进程标识符。  2. 创建子进程二, 打印子进程运行环境环境变量“USER”的值,通过exec系列的某个函数设置子进程”USER”环境变量值为“zhangsan”,并且让该子进程完成以下命令:“ls –li /home”.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值