千家信息网

怎么用Linux fork创建子进程

发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,今天小编给大家分享一下怎么用Linux fork创建子进程的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我
千家信息网最后更新 2025年01月17日怎么用Linux fork创建子进程

今天小编给大家分享一下怎么用Linux fork创建子进程的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。

1. pid_t fork(void);   

功能:创建父子进程   

参数:无   

返回值:成功:在父进程中:返回值为子进程的PID     

在子进程中:返回值为0     失败:-1 注意:   

1)fork函数是用来创建进程的,fork之后产生了两个进程,每个进程都会有返回值,   所以父进程中返回的是子进程的进程号(>0);在子进程中返回0

2)子进程几乎拷贝了父进程的全部内容。    包括代码、数据、系统数据段中的pc值、栈中的数据、父进程中打开的文件等;但它们的PID、PPID是不同的。

3)父子进程有独立的地址空间,互不影响;当在相应的进程中改变全局变量静态变量,都互不影响。

4)若父进程先结束,子进程成为孤儿进程被init进程收养(此时子进程的父亲就是init),子进程变成后台进程。(init进程号为1)

5)若子进程先结束,父进程如果没有及时回收,子进程变成僵尸进程(要避免僵尸进程产生)

2. pid_t getpid(void);

功能:得到正在调用此接口的进程的进程号

返回值:得到PID号

3. pid_t getppid(void);

功能:得到正在调用此接口的进程的父进程号

返回值:得到PID

4. pid_t wait(int *status) 头文件

功能:阻塞等待任意子进程的结束,回收资源 status是一个整型指针,指向的对象用来保存子进程退出时的状态。 status若为空,表示忽略子进程退出时的状态 status若不为空,表示保存子进程退出时的状态 另外,子进程的结束状态可由Linux中一些特定的宏来测定。

5. pid_t waitpid(pid_t pid, int *status, int options)

功能:等待子进程的结束,回收资源

参数:   

(1)pid: pid>0:只等待进程ID等于pid的子进程,不管已经有其他子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。 pid=-1:等待任何一个子进程退出,此时和wait作用一样。   

(2)status:同wait   

(3)options:WNOHANG:不阻塞,返回 0(没有接受到),pid号(成功接收到) 0:同wait,阻塞父进程,等待子进程退出。失败 -1 ,成功 pid号 返回值: 正常:结束的子进程的进程号,使用选项WNOHANG且没有子进程结束时:0 出错:-1 等价:wait(NULL) == waitpid(-1, NULL, 0)   WEXITSTATUS(status)

6. void exit(int status); 功能:结束正在调用的进程,程序结束前,会清理缓存区

7. _exit:void _exit(int status); 功能:结束正在调用的进程,程序结束前不清理缓存区 注意: status是一个整型的参数,可以利用这个参数传递进程结束时的状态。 通常0表示正常结束;其他的数值表示出现了错误,进程非正常结束。 在实际编程时,可以用wait系统调用接收子进程的返回值,进行相应的处理。 exit用于结束正在运行的整个程序,它将参数返回给OS,把控制权交给操作系统; 而return 是退出当前函数,返回函数值,把控制权交给调用函数。

fork创建子进程例子:

 #include #include #include #include #include  int main(int argc, const char *argv[]) {     pid_t pid;     pid = fork();     if(pid == -1)//失败返回 -1     {         perror("fork fail : ");         exit(1);     }     else if(pid == 0) //在子进程中:返回值为0     {         printf("child\n");         printf("child getpid() %d \n",getpid());         printf("child getppid() %d \n",getppid());         exit(1);     }     else //在父进程中:返回值为子进程的PID     {         int s;         wait(&s);         printf("fork\n");         printf("father pid %d\n",pid);//子进程pid         printf("father getpid() %d \n",getpid()); //父进程pid         printf("father getppid() %d \n",getppid());//父进程的父进程的pid         printf("father %d\n",WEXITSTATUS(s));         perror((char*)&s);     }     return 0; }

测试:

子进程会复制父进程的全部内容,出来pid号和ppid号,但是子进程程序执行从 fork 函数之后执行的

以上就是"怎么用Linux fork创建子进程"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

进程 功能 参数 函数 正在 状态 不同 内容 知识 程序 篇文章 系统 建子 成功 两个 变量 数据 阻塞 相同 僵尸 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 我的世界租赁服服务器断开连接 数据库按收录文件类型可分为 服务器cpu 家用 监控硬盘录像机专用服务器 香港高校网络安全专业 java应用软件开发考研 大学生与网络安全问题 喀什租房网络安全 深圳pdu服务器电源企业 用代码的方式创建一个药店数据库 数据库读者隔离级别 网络安全应用包括什么 广东数据库安全箱现货 前端软件开发岗位职责 苹果手机服务器建立安全的连接 保障数据库安全的技术有哪些 软件开发用联想小新可以吗 返利机器人软件开发公众号 不接入网络怎么访问服务器 云数据库和应用架构改变 科技互联网翻译招聘英文 四川pdu服务器电源厂家电话 018年国家网络安全周 数据库密码为空就是连不上 热点连接要网络安全密码 谁会名片赞软件开发 中心管理服务器和流媒体 可以将服务器分为 上海恩山互联网科技有限公司 泗阳大型网络技术批发价
0