Linux程序设计第二版练习题(第七章)

1、设计一个程序,要求程序运行后进入一个无限循环,当用户按下中断键(+Z)时,进入程序的自定义信号处理函数,当用户再次按下中断键(+Z)后,结束程序运行。

#include 
#include 
#include 
#include 
void fun_ctrl_z();
int main()
{
	signal(SIGTSTP,fun_ctrl_z);
	printf("主程序:程序进入一个无限循环!\n");
	while(1)
	{
		printf("这是一个无限循环(要退出请按+Z键)!\n");
		sleep(3);
	}
	exit(0);
}
void fun_ctrl_z()
{
	printf("你按了+Z键");
	signal(SIGTSTP,SIG_DFL);
}

2、设计一个程序,要求程序主题运行时,即使用户按下中断键(+C),也不能影响正在运行的程序,等程序主体运行完毕后才进入自定义信号处理函数。

#include 
#include 
#include 
#include 
#include 
void fun_ctrl_c();
int main()
{
	int i;
	sigset_t set,pendset;
	struct sigaction action;
	signal(SIGINT,fun_ctrl_c);
	if(sigemptyset(&set)<0)
		perror("初始化信号集合错误");
	if(sigaddset(&set,SIGINT)<0)
		perror("加入信号集合错误");
	if(sigprocmask(SIG_BLOCK,&set,NULL)<0)
		perror("往信号阻塞集增加一个信号集合错误");
	else
	{
		for(i=0;i<5;i++)
		{
			printf("显示此文字,表示程序处于阻塞信号状态!\n");
			sleep(2);
		}
	}
	if(sigprocmask(SIG_UNBLOCK,&set,NULL)<0)
		perror("从信号阻塞集删除一个信号集合错误");
}
void fun_ctrl_c()
{
	printf("\t你按了+C键");
	signal(SIGINT,SIG_DFL);
}

3、设计一个程序,要求创建一个管道PIPE,复制进程,父程序运行命令“ls -l”,把运行结果写入管道,子进程从管道中读取“ls -l”的结果,把读出的作为输入接着运行“grep ex7_5.c".

#include 
#include 
#include 
#include 
#include 
#include 
int main()
{
	pid_t pid;
	int pipe_fd[2];
	int r_num;
	char buf_r[1000],buf_w[1000];
	memset(buf_r,0,sizeof(buf_r));
	if(pipe(pipe_fd)<0)
	{
		printf("创建管道失败");
		return -1;
	}
	pid=fork();
	if(pid<0)
	{
		printf("创建子进程失败");
		exit(1);
	}
	else if(pid==0)
	{
		close(0);
		dup(pipe_fd[0]);
		execlp("grep","grep","ex7_5.c",NULL);
	}
	else
	{
		close(1);
		dup(pipe_fd[1]);
		execlp("ls","ls","-l",NULL);
		wait(NULL);
	}
	return 0;
}

你可能感兴趣的:(linux)