#include
#include
#include
#include
int galbol = 6;//定义全局变量
char buf[] = "Hello Linux";//定义一个字符串
int main(){
int var = 88;//定义一个局部变量
pid_t pid;//(pid_t 是一个宏定义,其实质是int 被定义在#include中)
puts(buf);//输出字符串
pid = fork();//执行fork函数并把返回值赋给pid
if (pid < 0)//如果返回值小于0,则创建失败
{
printf("error\n");
exit(0);
}
if (pid == 0)//返回值等于0,表示创建成功,是子进程运行
{
printf("This is children process!\n");
galbol++;
var++;
}
else //如果返回ID就是父进程
{
printf("This is parent process\n");
}
printf("pid=%d,ppid=%d,galbol=%d,var=%d\n",getpid(),getppid(),galbol,var);//用来测试的变量
return 0;
}
运行结果
讲解一下运行结果,首先输出了"Hello Linux!",这是我们放在创建进程之前的一个输出,接着创建一个进程,返回值是ID,则表明当前是父进程,接着输出几个变量,当前进程ID和父进程ID,变量galbol和val,由于在父进程中没有对两个变量的值进行修改,所以两个变量的值未发生改变。那接下来就是子进程,返回值是0,输出自己是子进程,然后执行子进程的代码,可以看到子进程的pid=5263,父进程ID=5983,刚好等于前面父进程的ID,并且修改了两个变量的值。
5.示例代码(二)——这次的demo是在父进程中打开一个文本文件,并进行读操作,再看创建的子进程能否也读取与父进程一样的文本文件。
#include
#include
#include
#include
char str[10]; //定义一个数组,用来测试
int main() {
FILE *fp; //fp文件指针
pid_t pid; //进程号
pid = fork();
fp = fopen("a.txt","r"); //以只读的方式打开文件
if (fp == NULL)
{
printf("Open error!"); //如果指针返回的值为NULL,则打开失败
exit(0);
}
else
{
if(pid < 0) //fork返回值小于0,创建失败
{
printf("Error!\n");
exit(0);
}
else if (pid == 0) //fork等于0,返回到新建的子进程
{
fread(str,sizeof(char),2,fp); //读两个字符,并输出到屏幕
puts(str);
}
else //否则返回到父进程
{
sleep(2);
fseek(fp,2L,SEEK_SET); //定位到子进程读取的两个字符之后开始
fread(str,sizeof(char),3,fp);//读取三个字符
puts(str);
}
}
return 0;
}
这是a.txt里面的内容
这是运行结果
可以看到,子进程打开了与父进程一样的文本文件。
6.总结一下:使用fork函数得到的子进程从父进程处继承了整个进程的地址空间,包括进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等
标签:fork,pid,C++,Linux,进程,返回值,include,ID
来源: https://www.cnblogs.com/953-zjf/p/13703716.html