- 论坛徽章:
- 0
|
本帖最后由 kgn28 于 2010-07-19 00:08 编辑
先看程序:- #include<iostream>
- using namespace std ;
- #include <fcntl.h>
- #include<unistd.h>
- #include<stdlib.h>
- #include<sys/types.h>
- #include<sys/wait.h>
- int inline my_sleep(int times){
- struct timeval t;
- t.tv_sec = times / 1000;
- t.tv_usec = (times % 1000) * 1000;
- select(0, NULL, NULL, NULL, &t);
- }
- int main(int argc, char * argv)
- {
- int n, fd[2];
- pid_t p;
- char buf[2048];
- int maxfds;
- struct timeval timeout;
- int select_ret;
- if(pipe(fd) < 0){
- perror("pipe create error");
- exit(2);
- }
- if((p = fork()) < 0){
- perror("fork error");
- }else if( p == 0) {
- close(fd[0]);
- cout<<"hi, I am the child process"<<endl;
- close(1);
- if(dup2(fd[1],1) < 0){
- perror("dup2 error");
- exit(1);
- }
- int ret = system("./scipt.sh ");
- if(ret < 0 ) {
- perror("system() error!\n");
- }else{
- if(ret == 127){
- cout<<"Startup shell script error"<<endl;
- }else if(ret == 0){
- cout<<"success!"<<endl;
- }else{
- cout<<"Executing command error!"<<endl;
- }
- }
- sleep(200);
- // while(1);
- exit(1);
- }else{
- cout<<"Hi, i am the parent process"<<endl;
- close(fd[1]); //close write fd
- fd_set readfds;
- FD_ZERO(&readfds);
- FD_SET(fd[0],&readfds);
- maxfds = fd[0]+1;
- timeout.tv_sec =2 ;
- timeout.tv_usec = 0;
- while(true){
- select_ret = select(maxfds,&readfds,NULL,NULL,&timeout);
- if(select_ret > 0){
- int len;
- printf("select_ret is %d\n", select_ret);
- if(FD_ISSET(fd[0], &readfds)){
- len = read(fd[0],buf,2048);
- buf[len] = '\0';
- printf("the message recv form child pross is :%s# len=%d\n",buf, len);
- memset(buf, 0x0, 2048);
- }
- } else {
- printf("select timeout\n");
- }
- timeout.tv_sec =2 ;
- timeout.tv_usec = 0;
- }
- wait(NULL);
- return 0;
- }
- }
复制代码 起初,子进程在printf后马上退出(exit),然后产生的情况就是父进程这么select会很快的返回,并且read的返回值也是0. 加了sleep之后父进程的select都是timeout。这个现象说明:
1,重新考察select的功能,select测试的是文件描述符是否(可读、可写、例外),如果对一个文件描述符的read不会被block,那么在测试该描述符可读时,select马上返回。
2,pipe,如果子进程把write的文件描述符关闭,那么父进程read的时候不会被block并且会一直返回0以示write端已经被关闭,所以这是去select,肯定是马上返回,read的返回值也就是0了。 |
|