Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1638705
  • 博文数量: 197
  • 博客积分: 10046
  • 博客等级: 上将
  • 技术积分: 1983
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 12:36
个人简介

在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。

文章分类
文章存档

2011年(2)

2010年(6)

2009年(18)

2008年(30)

2007年(100)

2006年(41)

分类: LINUX

2006-12-14 13:00:54

以前是要在项目加一个download的功能(要支持BT和普通的http/ftp) 在项目中应用了大量的IPC的东西,有信号, pipe,共享内存。还有select的用法。

 现在特意的总结出来,也许对别人有用。

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吧
    

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