Linux进程控制编程实验_02

2023-11-01

任务1:编写一个进程创建实验程序task51.c,创建如图所示的进程族亲结构,其中p1是程序启动时由加载程序创建第一个进程。各进程的输出信息分别如下:
p1:I am father process
p11: 当前时间是< 年 月 日 时 分 秒>
p12: I am young brother process
p121:我的学号是<您的学号xxx>
p122:我的姓名是<您的姓名xxx>
提示:获得当前系统时间的函数是 time_t time(time_t *t);
将time_t类型的的时间转换成时间字符串的函数是:char *ctime(const time_t *timep);
在这里插入图片描述

#include<stdio.h>
#include<time.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
	printf("I am father process\n");//p1打印
	if(fork() == 0)//p11输出时间
	{
		time_t timep;
		time(&timep);
		printf("%s",ctime(&timep));
	}
	else
	{
		if(fork() == 0)
		{
			printf("I am young brother process\n");//p12打印
			if(fork() == 0)//p121输出学号
			{
				printf("2018\n");
			}
			else
			{
				if(fork() == 0)//p122输出名字
					printf("name\n");
				
			}
			wait(NULL);//p12等待子线程完成
		}
		wait(NULL);//p1等待子线程完成
	}
}

任务2:参考教材shellex.c代码,实现一个简单的交互式shell程序task52.c,具备的功能至少有:
(1)打印提示符%;获取用户输入指令;解析指令;寻找命令文件,执行指令
(1)显示命令提示符%;
(2)获取用户输入指令;解析指令;寻找命令文件,执行指令;
(3)前一个命令完成后才继续显示命令提示符%,等待用户输入下一条命令;
(3)如果输入“exit”或“logout”,则退出shell.
(4)允许命令参数间有多个空格,也允许命令前后有空格
(5)支持输出重定向和管道功能。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<fcntl.h>
#define Max 50
void eval_f(char* command);//执行需要重定向的命令行
void eval(char * command);//执行不需要重定向的命令行
void pa();//接受父进程接受子进程信号SIGUSR1处理函数
int main(){
	char com[Max];//接收命令
	while(1){
		printf("%%");
		fgets(com,Max,stdin);
		int num = strlen(com);
		com[num-1]='\0';//fgets函数会把最后一位\n传入字符串
		if(fork()==0)//子进程解析并执行命令行
		{
			if(strstr(com,"<")!=NULL)//是否包含重定向标准
				eval_f(com);
			else
				eval(com);
			exit(0);//子进程退出 以免影响后续进行
		}
		else{
			signal(SIGUSR1,pa);//接收子进程信号
			wait(NULL);//等待子进程结束
		}

	}
}

void eval(char* com){
	char * arv[Max];
	//利用strtok函数分割字符串
	if((arv[0] = strtok(com," "))==NULL)//只有单个命令 例如:ls
		arv[0] = com;
	else{//命令+参数 例如 ls -l
		int cnt =1;//the count of arv
		while((arv[cnt] = strtok(NULL," ")) != NULL){
			cnt++;
		}
	}
	//特殊标识处理
	if(arv[0]==NULL||!strcmp(arv[0],"exit")||!strcmp(arv[0],"logout")){
		kill(getppid(),10);
		return;
	}
	if(execvp(arv[0],arv)<0){//evecvp执行命令,成功不返回,失败返回-1
		printf("%s Command not found\n",arv[0]);
	}
	return;
}
void eval_f(char* command){
	char* com,*file;
	file = strstr(command,"<")+1;
	file = strtok(file," ");//提取文件名
	com = strtok(command,"<");//提取命令
	int fd,save_fd;
	fd = open(file,O_WRONLY|O_CREAT|O_TRUNC,0777);
	//先把输出保存后再关掉,dup2函数使输出接到文件,输出后关闭并还原终端输出
	//具体见下图
	save_fd = dup(STDOUT_FILENO);
	dup2(fd,STDOUT_FILENO);
	close(fd);
	eval(com);
	dup2(save_fd,STDOUT_FILENO);
	close(save_fd);
}
void pa(){
	exit(0);
}

在这里插入图片描述
任务3:写一个信号机制实验程序task53.c,由父进程创建两个子进程,通过终端输入Crtl+\组合键向父进程发送SIGQUIT软中断信号或由系统时钟产生SIGALRM软中断信号发送给父进程;父进程接收到这两个软中断的其中某一个后,向其两个子进程分别发送整数值为SIGUSR1 (10)和SIGUSR2(12)软中断信号,子进程获得对应软中断信号后,分别输出“<进程PID> killed by <信号编号>”后,终止运行;父进程调用wait()函数等待两个子进程终止,然后自我终止。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/wait.h>
pid_t pid1,pid2;
void pa(int sig)
{
    kill(pid1, 10);
    kill(pid2, 12);
}
void child(int sig)
{
    printf("%d killed by %d\n",getpid(),sig);
}
int main()
{
    signal(SIGQUIT,SIG_IGN);//防止子进程提前退出
    if(pid1 = fork() == 0)
    {
    	signal(SIGUSR1,child);
	pause();
	exit(0);
    }
    else{
    	if(pid2 = fork() ==0)
	{
		signal(SIGUSR2,child);
		pause();
		exit(0);
	}
	else
	{
	//10秒后没有接收到ctrl+\发送的SIGQUIT信号则向主进程发送时钟信号
	alarm(10);	
	signal(SIGALRM,pa);
	signal(SIGQUIT,pa);
	pause();
	wait(NULL);
	}
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux进程控制编程实验_02 的相关文章

  • Linux命令列出所有可用命令和别名

    是否有一个 Linux 命令可以列出该终端会话的所有可用命令和别名 就好像您输入 a 并按下 Tab 键一样 但针对的是字母表中的每个字母 或者运行 别名 但也返回命令 为什么 我想运行以下命令并查看命令是否可用 ListAllComman
  • 在 shell 脚本中查找和替换

    是否可以使用 shell 在文件中搜索然后替换值 当我安装服务时 我希望能够在配置文件中搜索变量 然后在该值中替换 插入我自己的设置 当然 您可以使用 sed 或 awk 来完成此操作 sed 示例 sed i s Andrew James
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • Linux 上的 Python 3.6 tkinter 窗口图标错误

    我正在从 Python GUI 编程手册 学习 Python GUI 某项任务要求我通过将以下代码添加到我的配方中来更改窗口图标 Change the main windows icon win iconbitmap r C Python3
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • 如何成功使用RDAP协议代替whois

    我对新的 RDAP 协议有点困惑 也不知道何时进一步追求它有意义 在我看来 每个人都同意它是 whois 的继承者 但他们的数据库似乎是空的 在 ubuntu 上我尝试了 rdapper nicinfo 甚至他们的 RESTful API
  • 如何让 clangd 转向 c++20

    当没有其他信息时 如何让 clangd 回退到 c 20 例如 在第一次构建之前 cmake 可以生成一个 这是在带有最新 LLVM 的 Arch Linux 上 这是通过 Emacs LSP 运行的 但这应该没有什么区别 你可以加 Com
  • gentoo crontab:为什么这个简单的 crontab 不起作用?

    我使用 GENTOO 发行版 crontab e 35 12 root php5 home www cron php 当我手动运行时 php5 php5 home www cron php 这有效 它向我发送了一封电子邮件 然后我检查日期
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 设置 Apache POI 的路径

    我想创建 Excel 文件并使用 java 程序在该文件中写入数据 That is here http www techbrainwave com p 554我在 java 文件所在的位置提取了 Apache POI 并将该路径包含在路径变
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然

随机推荐

  • 【习题四】【数据库原理】

    文章目录 一 单选题 二 填空题 三 简答题 Reference 一 单选题 1 表达了数据和处理过程的关系 A 数据字典 B 数据流图 C 逻辑设计 D 概念设计 正确答案 B 2 设计子模式属于数据库设计的 A 需求分析 B 概念设计
  • 为什么计算机采用二进制而不是八进制或者十六进制

    电子计算机能以极高速度进行信息处理和加工 包括数据处理和加工 而且有极大的信息存储能力 数据在计算机中以器件的物理状态表示 采用二进制数字系统 计算机处理所有的字符或符号也要用二进制编码来表示 用二进制的优点是容易表示 运算规则简单 节省设
  • 21亿春节红包撒出去,能缓解快手的流量焦虑吗?

    来源 连线Insight 编辑 李信 抖音作为央视春晚合作伙伴 着实火了一把 官方数据显示 春晚期间 抖音红包的总互动次数达到703亿 在抖音宣布成为2021年春晚独家红包互动合作伙伴时 最焦虑的莫过于快手 1月28日 快手官方微博宣布拿下
  • 类默认成员函数 - 析构函数

    析构函数与构造函数就是功能截然相反的两个函数了 析构函数就是将对象内部的资源进行清理 如malloc开辟的等 值得注意的是 很多人误以为析构函数是销毁对象 对象的销毁工作是由编译器完成的 我们现在说说析构函数的有那些特性 1 还是重析构函数
  • 咖说丨一文了解区块链在医疗领域的应用案例

    收集一众行业大咖观点 探索区块链商业及应用 百家争鸣 百花齐放 说理 解密 预测和八卦 了解行业内幕 看咖说就够了 投稿请联系 tougao conflux chain org 本文转自 白话区块链 作者 Wayne 换了一家医院就诊就要重
  • 阿里手淘猜你喜欢Swing算法介绍

    Swing算法原理比较简单 是阿里早期使用到的一种召回算法 在阿里多个业务被验证过非常有效的一种召回方式 它认为 user item user 的结构比 itemCF 的单边结构更稳定 Swing指的是秋千 例如用户 u uu 和用户 v
  • Shell常用的几个正则表达式:[:alnum:], [:alpha:], [:upper:], [:lower:], [:digit:] 认知

    一 通配符命令简介 匹配符合相关条件的符号 匹配文件名查找 通配符类型 匹配任意长度的任意字符 匹配任意单个字符 匹配指定范围内的任意单个字符 匹配指定范围之外的任意单个字符 space 空白字符 punct 标点符号 lower 小写字母
  • 由java转c++ 和qt的学习心得

    接触qt有一周左右了 写下这篇文章 用于反思自己前几日浑浑噩噩 也用于警醒自己 我是从java转到c 到qt开发的 原先以为编程语言是相通的 但是接触之后才发现 换一种新语言学 很难 接下来回顾两点 一 c 的学习思考 c 中 我认为最为重
  • 21.shell语言之if条件判断语句

    个人简介 作者简介 大家好 我是小鹏linux 运维领域新星创作者 个人主页 小鹏linux 支持我 点赞 收藏 留言 格言 你未必出类拔萃 但一定与众不同 系列专栏 阶段一 windows基础 原创16篇 阶段二 Linux基础知识 原创
  • Mac安装Redis后的配置

    Mac安装Redis后的配置 找到安装目录 配置文件修改 启动服务做测试连接 找到安装目录 1 双击 右键 访达 点击前往文件夹进行查找 如下图所示 2 然后再如下图所示中找到如下路径 usr local bin 3 找到redis con
  • hibernate mysql 超时_Hibernate连接数据库超时设置autoReconnect=true

    com mysql jdbc CommunicationsException The last packet successfully received from the server was58129 seconds ago The la
  • 小程序云开发——图片视频资源上传云端并返回云端路径

    在现在的应用中 包括小程序 图片视频等元素是产品必不可少的一部分 如果一个产品仅支持文字 将会很单调 有时候我们需要将图片视频上传到云端或者服务器 我这里将介绍在小程序中怎么上传图片和视频到云端 并返回云端路径 可以将这个云端路径存入数据库
  • 第三讲:IP地址和子网掩码

    一 标准分类的IP地址 每台计算机都要有IP地址 有了IP地址才能互相通信 计算机之间只能互相认识IP地址 IP地址可以理解为计算机的身份证号 一 二进制和十进制数转换 记住 10000000 2 128 10 1000000 2 64 1
  • PhpStorm+Xdebug+PHPStudy配置并调试

    首先 火狐浏览器搜索插件并安装 配置IDE key 打开phpinfo 将内容复制到Xdebug Support Tailored Installation Instructions 会推荐你适合版本的xdebug 当然你也可以选择phps
  • UE4 全局变量的应用(蓝图)

    4 20 1 创建全局变量 命名为MyGameInstance 2 创建一个变量 命名为MyB 3 在项目设置中 搜索GameInstence 并选中创建的全局变量 4 在蓝图里调用全局变量 5 成功打印
  • Tmux使用教程

    Tmux 是一款可以管理会话和分屏的终端复用器 在远程 SSH 断开后可以继续执行任务 重新连接后再继续会话 也能够将进程放到后台运行 需要时重新接管 为了防止 SSH 因网络断开造成的进程运行中断 推荐把所有需要长期运行的训练等任务都使用
  • 提升效率之如何打印出漂亮的带颜色的日志(输出高亮)

    花里胡哨的日志 1 花里胡哨的shell打印 2 c语言日志的彩色输出 日志系统对于一个软件的维护是很重要的 对于直接在本地打印的信息 可能包含非常多 如何才能快速发现自己想要打印的东西呢 带上颜色的输出 绝对是很好的选择 使用c c 的输
  • 二、网络编程之协议及协议格式详解

    引言 在网络编程中 我经常听人提起过协议 标准协议 协议族 TCP协议 传输层协议 诸如此类的协议概念 这些种类繁多的名词听着让人感觉头晕 所以今天继续学习和总结协议的相关知识 在前面一篇文章 网络编程之基础知识详解 中已经简单介绍过协议
  • vue3中使用echart多个图表,并且可以随着屏幕大小自适应布局

    一 在项目中安装echarts npm install echarts save 二 引入echarts 1 因为多个地方需要使用到这个echart图表 所以将这个echarts写在自定义组件中 子组件 chart vue div clas
  • Linux进程控制编程实验_02

    任务1 编写一个进程创建实验程序task51 c 创建如图所示的进程族亲结构 其中p1是程序启动时由加载程序创建第一个进程 各进程的输出信息分别如下 p1 I am father process p11 当前时间是 lt 年 月 日 时 分