父进程创建了一个无名管道, 子进程在管道写端写入value , 父进程通过select()函数检测管道的读端,如果5秒钟内读端无反应,说明超时,否则就可以读value! 这样就是简单的实现父子进程同步,通信,且有限时间等待的要求!
pid_t pid = 0; int fd[2]; //pipe operation :
unsigned char share_buffer[3]; //share info between parent process and child process
fd_set read_fds; int fd_max ; /* for select */ struct timeval tv; int select_rc = 0;
if(pipe(fd) < 0) { perror("create pipe"); return SERVER_PIPE_FAIL; }
signal(SIGCHLD,SIG_IGN); //防止出现Zombie 进程,如果忘记了,复习一下上面!
pid = fork(); if(pid < 0) { perror("fork a child to download file failure"); return SERVER_FORK_FAIL; } else if(pid == 0) { unsigned char buffer[3]; //子进程往里面写数据
int rc = -1;
setsid(); /* generate a daemon process * setsid()是创建daemon的关键函数,(1)成为session的leader process , *(2)成为进程组的leader process ,(3)没有终端 */ umask(0); /* 当创建文件的时候和目录的时候 默认是 umask(022) , * umask()函数可以改便创建文件时候的默认许可权位 , 据个例子,当你用root权限 * 创建一个文件 , > bob.txt ,你会发现: ll bob.txt , 显示 -rw-r--r-- , * 这就是umask(022)的作用 , 022 对应的二进制: 000 010 010 ,表示 对于 * 组内用户和其他的用户 不可有w的权限。 w位置1 就表示不可以w !以此类推! */ close(0); //关闭标准输入
close(1); //关闭标准输出
close(2); //关闭标准错误输出
chdir("/");
close(fd[0]); //把管道的读 一端 关闭 ,只留写 一端 即可
//执行你的程序 ,你的code
。。。 //在exit(0)之前,通知你的父进程你的执行结果, rc就是执行结果
buffer[0] = rc; buffer[1] = '\0'; buffer[2] = '\0'; write(fd[1],buffer,sizeof(buffer)); close(fd[1]); //end of write to the "write pipe" ,must close it
exit(0); } //子进程结束!
//父进程内
close(fd[1]); //关闭写端 ,只要留着读端即可!
FD_ZERO(&read_fds); //clear the read_fds
FD_SET(fd[0], &read_fds);
tv.tv_sec = 5 //假设父进程就等待5s
fd_max = fd[0]+1;
//select 不熟悉select()的朋友可以到google搜索它的用法,一定要掌握!
select_rc = select(fd_max,&read_fds,NULL,NULL,&tv);
if(!select_rc) //wait超时 ,
//你的处理code , 也许这正是你期待的呢!
else { read(fd[0],share_buffer,sizeof(share_buffer)); jprintf("read successfully\n"); jprintf("in father :buffer[0] = %d\n",share_buffer[0]); jprintf("in father :buffer[1] = %d\n",share_buffer[1]); jprintf("in father :buffer[2] = %d\n",share_buffer[2]); close(fd[0]); //close read pipe , 读完毕后记着关闭它!
//你可以根据buffer读出的内容作进一步的处理
//你的code
}
|