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.