先看fork
返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1。
fork有以下几个特点:
1.子进程是父进程的副本。子进程获得父进程数据空间、堆和栈的副本(主要是数据结构的副本)。
2.父子进程不共享这些存储空间。父子进程共享正文端。
3.子进程对变量所作的改变并不影响父进程中该变量的值。
4.标准I/O是缓冲的,如果标准输出到终端设备,则它是行缓冲,否则它是全缓冲。
当以交互方式运行该程序时,只得到printf输出的行一次,因为标准输出到终端缓冲区由换行符冲洗。
但将标准输出重定向到一个文件时,由于缓冲区是全缓冲,遇到换行符不输出。
调用fork时,其printf的数据仍然在缓冲区中,该数据将被复制到子进程中,该缓冲区也被复制到子进程中。于是父子进程的都有了带改行内容的标准I/O缓冲区,所以每个进程终止时,会冲洗其缓冲区中的数据,得到输出结果。
我们看题一:
#include < unistd.h >
#include < stdio.h >
int main(int argc, char *argv[])
{
int i;
pid_t pid;
for(i=0; i<2; i++)
{
pid = fork();
printf("-");
}
return 0;
}
这里输出8个短杠(-)
分析:
我们看题二:
#include < unistd.h >
#include < stdio.h >
int main(int argc, char *argv[])
{
int i;
pid_t pid;
for(i=0; i<2; i++)
{
printf("-");
pid = fork();
}
return 0;
}
这个程序也是输出8个-
这里与题一大概的程序一样,可是理解却完全不一样。
我们看题三:
#include < unistd.h >
#include < stdio.h >
int main(int argc, char *argv[])
{
int i;
pid_t pid;
for(i=0; i<2; i++)
{
pid = fork();
printf("-\n");
}
return 0;
}
这里输出6个-
分析:
我们看题四:
#include < unistd.h >
#include < stdio.h >
int main(int argc, char *argv[])
{
int i;
pid_t pid;
for(i=0; i<2; i++)
{
printf("-\n");
pid = fork();
}
return 0;
}
这里输出3个-
分析: