Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2275908
  • 博文数量: 668
  • 博客积分: 10016
  • 博客等级: 上将
  • 技术积分: 8588
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-29 19:22
文章分类

全部博文(668)

文章存档

2011年(1)

2010年(2)

2009年(273)

2008年(392)

分类:

2009-06-17 15:09:17

1>pipe的例子:用途:在父进程中fork一个子进程去执行curl或者ctorrent命令,但是子进程必须在5s内作出反映, 好让父进程知道子进程的执行结果:

代码: 用信号的方式:

 

/* 利用信号实现父子进程通信(传递信息)和同步,author by bob
#include
#include
#include

void sig_usr2(int signo,siginfo_t *info,void *myact)
{
    printf("signo = %d\n",signo);
    printf("child process has sent its signal \n");
}
int main(void)
{
    sigset_t wait_set;
    int sig_no;
    const struct timespec tv = {5,0}; //timeout
    siginfo_t sig_info ;//传递的信息结构
    pid_t pid = 0;

    sigemptyset(&wait_set);
    sigaddset(&wait_set,SIGUSR2);
    
    signal(SIGCHLD,SIG_IGN);    //父进程显式的忽略子进程发来的SIGCHLD信号 ,防止出现Zombie 进程,如果忘记了,复习一下上面!

    pid = fork();
    if(pid < 0) {
        printf("fork failure \n");
        exit(-1);
    }
    if(pid == 0) {
        int rc = 0;
        union sigval rc_val; //子进程要传递的信息
        setsid();
        umask(0);
        chdir("/");
        rc = system("curl -O &>/dev/null");
        printf("rc = %d\n",rc);
        rc_val.sival_int = rc/255; //传递整型值
        if(getppid() > 1) { //因为如果过了timeout , 父进程就退出了, 该子进程被init(1)领养, 所以千万不要向init(1)发信号!否则整个系统都要reboot 了!
            sigqueue(getppid(),SIGUSR2,rc_val);//给父进程发信号!,getppid()可以获得父进程的pid
        } 
        exit(0);
    }    
        
    //parent process
again:
    sigprocmask(&wait_set);
    sig_no = sigtimedwait(&wait_set,&sig_info,&tv); //父进程会一直阻塞tv时间,然后就返回
    if(sig_no == -1) { //说明超时
        
        if(errno == EINTR) //表示被别的信号给中断了
        {
            goto again; //重新调用sigwaitinfo() 继续等待
        else if(errno == EAGAIN); //如果你用的是sigtimedwait()函数,这个也许有用,表示在规定的timeout时间无法获得资源, errno== EAGAIN
            printf("child process timeout \n");
            printf("curl 一直没有返回,这样下载看起来没有问题, 正在下载\n");
        }
    }
    else {
        printf("child process return value = %d\n",sig_info.si_int);
        if(sig_info.si_int == 0) //信号传递的信息! 我们在这里传递integer值!
            printf("下载完毕\n");
        else
            printf("下载出错,错误代码 %d\n", sig_info.si_int);
    }
    return 0;
}
*/

 

用pipe的方式:

 

见 进程通信实例2吧
    


阅读(1018) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~