您的位置:首页 > 编程语言

信号编程实例:父进程拷贝文件,子进程定期询问进度

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);}




父进程:(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无限循环
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: