学习fork()的心得

本文分享了学习fork()系统调用的心得,包括错误处理、进程控制和并发执行的理解。通过示例解释了如何获取进程ID、创建与终止进程,并详细解析了forks10-15函数的使用,强调了调用fork()后的并发执行特性和进程独立性。
摘要由CSDN通过智能技术生成

学习fork()的心得


一、系统调用错误处理

例:小于在这里插入图片描述

二、进程控制

1.获取进程id

每个进程都有唯一的正数(非零)进程ID(PID)。
在这里插入图片描述
如上图,getpid函数返回调用进程的PID。getppid函数返回它的父进程的PID(创建调用进程的进程)

2.创建和终止进程

#include <stdlib.h>

void exit(int status);

exit函数以status退出状态来终止进程(另一种设置退出状态的方法是从主程序中返回一个整数值)

3.示例及注释

int main()
{
   
	pid_t pid;
	int x = 1;
	pid = Fork();
	if(pid == 0{
   /*child*/
		printf("child : x=%d\n",++x);
		exit(0);/*若没有exit(0)子进程也要输出下面的代码*/
	}
	/*Parent*/
	printf("parent : x=%d\n",--x);
	exit(0);
}

上述示例需要注意的地方

  • 调用一次,返回两次。fork函数被父进程调用了一次,却返回两次——一次是返回到父进程,一次是返回到新创建的子进程。

  • 并发执行。父进程和子进程是并发运行的。他们都是独立的个体,无法推测谁先进行。

三、forks10-15函数解析

#define N 5
/*
 * fork10 - Synchronizing with multiple children (wait)与多个进程同步(等待)
 * Reaps children in arbitrary order按任意顺序回收孩子进程
 * WIFEXITED and WEXITSTATUS to get info about terminated children获取已终止的子进程的信息
 */
void fork10()
{
   
    pid_t pid[N];
    int i, child_status;
 
    for (i = 0; i < N; i++)
	if ((pid[i] = fork()) == 0) {
   
	    exit(100+i); /* Child */
	}
    for (i = 0; i < N; i++) {
    /* Parent */
	pid_t wpid = wait(&child_status);
	if (WIFEXITED(child_status))//如果子程序通过调用exit或return正常终止
	    printf("Child %d terminated with exit status %d\n"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值