Chinaunix首页 | 论坛 | 博客
  • 博客访问: 642175
  • 博文数量: 128
  • 博客积分: 4385
  • 博客等级: 上校
  • 技术积分: 1546
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-22 14:05
文章分类

全部博文(128)

文章存档

2012年(2)

2011年(51)

2010年(75)

分类: LINUX

2010-08-24 20:11:55

多进程编程
 
 

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

void die(const char *msg)
{
        perror(msg);
        exit(1);
}

void child2_do()
{
        printf("In child2: execute 'date'\n");

        sleep(5);
        if (execlp("date", "date", NULL) < 0) {
                perror("child2 execlp");
        }
}

void child1_do(pid_t child2, char *argv)
{
        pid_t pw;

        do {
                if (*argv == '1') {
                        pw = waitpid(child2, NULL, 0);
                }
                else {
                        pw = waitpid(child2, NULL, WNOHANG);
                }
                if (pw == 0) {
                        printf("In child1 process:\nThe child2 process has not exited!\n");
                        sleep(1);
                }
        }while (pw == 0);

        if (pw == child2) {
                printf("Get child2 %d.\n", pw);
                sleep(5);
                if (execlp("pwd", "pwd", NULL) < 0) {
                        perror("child1 execlp");
                }
        }
        else {
                printf("error occured!\n");
        }
}

void father_do(pid_t child1, char *argv)
{
        pid_t pw;

        do {
                if (*argv == '1') {
                        pw = waitpid(child1, NULL, 0);
                }
                else {
                        pw = waitpid(child1, NULL, WNOHANG);
                }

                if (pw == 0) {
                        printf("In father process:\nThe child1 process has not exited.\n");
                        sleep(1);
                }
        }while (pw == 0);

        if (pw == child1) {
                printf("Get child1 %d.\n", pw);
                if (execlp("ls", "ls", "-l", NULL) < 0) {
                        perror("father execlp");
                }
        }
        else {
                printf("error occured!\n");
        }
}

int main(int argc, char *argv[])
{
        pid_t child1, child2;

        if (argc < 3) {
                printf("Usage: waitpid [0 1] [0 1]\n");
                exit(1);
        }

        child1 = fork();

        if (child1 < 0) {
                die("child1 fork");
        }
        else if (child1 == 0) {
                child2 = fork();

                if (child2 < 0) {
                        die("child2 fork");
                }
                else if (child2 == 0) {
                        child2_do();
                }
                else {
                        child1_do(child2, argv[1]);
                }
        }
        else {
                father_do(child1, argv[2]);
        }

        return 0;
}

多进程编程模板,只要修给其中的child1_do(),child2_do(),father_do()这几函数就可以了!

 

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