您的位置:首页 > 运维架构 > Linux

linux 下的多进程和多线程的使用方法及对比

2015-01-09 16:12 232 查看

linux 下的多进程和多线程的使用及对比,系统 Ubuntu 14.04 编译器gcc 4.9

            linux 下创建进程的函数原型是: pid_t fork(void);这个函数没有参数,却有一个返回值.返回值得的类型是pid_t,其实是pid_t 在32位Linux操作系统下是一个int 型的整数.具体可见pid_t的头文件定义.从pid_t 的名字上可以看出,它代表着相关进程的进程号.

           fork()这个函数比较特殊.其返回值有3种可能.

1.如果调用失败,则返回-1.一般出现的几率很小

2.如果调用成功,返回值有两个,一个是大于0的整数,代表父进程调用返回.另一个是等于0的整数,代表子进程调用返回.

具体用法见以下代码:

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/wait.h>

int main()

{

    pid_t pid1;

    if((pid1=fork())<0)

    {

        perror("fork()");

        exit(-1);

    }

    else if(0 == pid1)

    {

        printf("I am child process!\n");

        exit(0);    

    }

    else

        printf("I am parent process!\n");

        wait(NULL);

        return 0;

}


返回结果如下图:

注意创建多进程的时候,不要忘记调用wait或者waitpid,回收子进程.以免产生僵尸进程.

下面我们来看一下这个例子.见以下代码:

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/wait.h>

int main()

{

    pid_t pid1;

    int tempa=0;

    if((pid1=fork())<0)

    {

        perror("fork()");

        exit(-1);

    }

    else if(0 == pid1)

    {

        while(1)

        printf("I am child process B!\n");

        exit(0);    

    }

    else

        while(1)

        printf("I am parent process A!\n");

        wait(NULL);

    return 0;

}

结果如下:

父子进程交替进行.

再看一个程序:

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/wait.h>

int main()

{

    pid_t pid1;

    int tempa=0;

    if((pid1=fork())<0)

    {

        perror("fork()");

        exit(-1);

    }

    else if(0 == pid1)

    {

        tempa++;

        printf("I am child process A,tepma is %d.\n",tempa);

        exit(0);    

    }

    else

        tempa++;

        printf("I am parent process B,tempa is %d.\n",tempa);

        wait(NULL);

    return 0;

}

结果如下图:

这个结果说明了,在多进程下,进程空间的资源是隔离的子进程的,tempa和父进程的tempa是相互独立的,不受影响的.所以最后的输出结果都是1.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐