信号编程实例:父进程拷贝文件,子进程定期询问进度
2011-04-26 10:49
495 查看
#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <signal.h>int count; int 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]; if(argc!=3) { printf("Pls check command format"); return -1; } if((fd_src=open(argv[1],O_RDONLY))==-1) { perror("Open source file failed!"); return -1; } 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 target file failed!"); return -1; } if((pid = fork()) == -1) { perror("Create process failed"); return -1; } else if(pid > 0)//in father process { signal(SIGUSR1,sig_usr);//install signal SIGUSR1 do { memset(buf,'/0',128); if((i=read(fd_src,buf,1))==-1) { perror("Read file failed"); return -1; } else if(i==0) { kill(pid,SIGINT); break; } else { if(write(fd_des,buf,i)==-1) { perror("Write file failed"); return -1; } count+=i; } } while(i!=0); wait(pid,NULL,0); exit(EXIT_SUCCESS); } else if(pid == 0)//in child process { usleep(1); signal(SIGALRM,sig_alarm); ualarm(1,1); while(1) { ; } exit(EXIT_SUCCESS); }}void sig_alarm(int arg){ kill(getppid(),SIGUSR1);}void sig_usr(int sig){ float i; i=(float)count/(float)file_size; printf("Copy finished: %0.0f%%/n",i*100);}
![endif]-->!-->![endif]-->!-->![endif]-->!-->
父进程:(1) 打开源文件和目标文件(2) 安装信号SIG_USR1,当此进程收到此信号时,执行sig_usr函数(3) 循环地读文件,直到文件读取完毕。如果读取完毕,则向子进程发送中断的信号SIGINT。(4) 回收子进程wait(5) 退出exit 子进程:(1) 安装SIG_ALARM信号,当子进程收到SIG_ALARM信号时,将会调用sig_alarm函数(2) 调用ualarm函数定期产生SIG_ALARM信号(3) While无限循环
相关文章推荐
- Linux文件编程之【系统调用】——综合实例:文件拷贝
- shell编程实例四实现文件拷贝
- 拷贝文件(能显示进度条)[原创]
- 标准IO实现文件拷贝实例一
- java基础进阶(文件列表,线程,线程组)编程实例(4篇)
- 通过fork()创建子进程同时分工拷贝一份文件
- 零基础学Qt 4编程实例之三:勾三股四弦必五—文件包含语句与标准库的使用
- C#利用VB的My功能来显示文件拷贝、删除、移动进度
- 拷贝文件的时候显示进度
- c#根据文件大小显示文件复制进度条实例
- 自定义控件实现多文件拷贝进度
- mysql通过拷贝文件实现数据快速迁移实例
- 标准IO实现文件拷贝实例二
- shell脚本编程实例--进度条,求和&平均值,斐波那契,改变字符串大小顺序
- 《突破C#编程实例五十讲》源文件下载(1)
- 零基础学Qt 4编程实例之三:勾三股四弦必五—文件包含语句与标准库的使用
- Process进程 ; Thread线程 (拷贝文件,带进度条的使用实例)
- OpenCV图像编程实例-图像文件批量读取
- Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听
- [Linux进程]在父进程和子进程中分别对文件进行操作