【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 信号应用实例


【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 信号应用实例


创建了两个进程:
父亲进程执行文件拷贝操作(为验证此程序,请选择大小在M级以上文件),如果接收到SIGUSR1信号,将打印出当前的拷贝进度,因此,父亲进程需要安装SIGUSR1信号;
子进程每隔一个固定时间(其时间由ularm函数产生SIGALRM信号来决定)向父亲进程发送SIGUSR1信号。因此,子进程需要安装SIGALRM信号。

示例代码:

#include<stdio.h>

#include<fcntl.h>

#include<unistd.h>

#include<stdlib.h>

#include<string.h>

#include<signal.h>

#include<stdlib.h>



//the copy fie size must>M

int count;				//current copy number

int file_size;			//the file size

void sig_alarm(int arg);

void sig_usr(int sig);



int main(int argc,char *argv[])

{

	pid_t pid;

	int i;

	int fd_src,fd_des;

	char buf[128];		//in order to infirm the problem, buf can set small

	

	if(argc!=3)

	{

		printf("check the format:comm src_file des_file\n");

		return -1;

	}

	if( ( fd_src=open(argv[1],O_RDONLY) )==-1 )

	{

		perror("open file src");

		exit(EXIT_FAILURE);

	}

	

	file_size=lseek(fd_src,0,SEEK_END);//获取文件大小!!!

	lseek(fd_src,0,SEEK_SET);

	

	if( (fd_des=open(argv[2],O_RDWR|O_CREAT,0644) )==-1 )

	{

		perror("open fd_fdes");

		exit(EXIT_FAILURE);

	}

	

	if( (pid=fork())==-1)

	{

		perror("fork");

		exit(EXIT_FAILURE);

	}

	else if(pid>0)

	{

		signal(SIGUSR1,sig_usr);

		do

		{

			memset(buf,'\0',128);

			if((i=read(fd_src,buf,1))==-1)	//the copy number may modify

			{

				perror("read");

				exit(EXIT_FAILURE);

			}

			else if(i==0)

			{

				kill(pid,SIGINT);

				break;

			}

			else

			{

				if(write(fd_des,buf,i)==-1)

				{

					perror("write");

					exit(EXIT_FAILURE);

				}

				count+=i;

				//usleep(1);

			}

		}while(i!=0);

		

		wait(pid,NULL,0);

		exit(EXIT_SUCCESS);

	}



	else if(pid==0)

	{

		usleep(1);	//wait for parent to install signal

		

		signal(SIGALRM,sig_alarm);

		ualarm(1,1);	//if alarm ,in sig_alarm function to install again

		while(1)

		{

			;

		}

		exit(EXIT_SUCCESS);

	}



}



void sig_alarm(int arg)

{

	//alarm(1);			//if alarm may add this line

	kill(getppid(),SIGUSR1);

}



void sig_usr(int sig)

{

	float i;

	i=(float)count/(float)file_size;	

	printf("curent over :%0.0f%%\n",i*100);

}


原文链接:http://blog.csdn.net/geng823/article/details/40948379

Linux高级程序设计》是由杨宗德和吕光宏合著的一本经典编程书籍。该书具有以下特点和价值: 首先,该书全面而深入地介绍了Linux高级编程概念和技术,涵盖了Linux系统编程的方方面面。读者可以从中学习到Linux程序设计的基本知识,如进程管理、线程编程、文件操作、内存管理等,同时也可以学习到高级技术,如网络编程、信号处理、套接字编程等。 其次,该书注重实践与理论的结合,通过丰富的代码示例和实际案例,帮助读者加深对Linux编程的理解和应用。这些示例和案例设计合理,代码规范,可以帮助读者快速掌握各种编程技术,并提供了实际项目开发经验。 再次,该书系统性强,内容全面而深入。从系统调用、文件系统到网络编程、进程间通信,从基础知识到高级技术,涵盖了Linux程序设计的方方面面。由浅入深的组织结构和清晰的逻辑思路,使得读者可以循序渐进地学习,并可以根据自身需求选择阅读的内容。 最后,该书是一本经典且广泛应用于教育和实践的优秀教材。它以其权威性和实用性备受好评,成为许多大学和学院的Linux编程教材。除此之外,该书也适合有一定编程基础的工程师和开发人员自学。 总之,杨宗德和吕光宏的《Linux高级程序设计》是一本经典而实用的Linux编程教材,内容丰富、全面,适合初学者和有一定基础的程序员学习和参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值