Linux系统父子进程(wait回收子进程,exec族函数)_linux wait childpid

(1)fork的内部原理:进程的分裂生长模式,如果操作系统需要一个新进程来运行一个程序,那么操作系统会用一个现有的进程来复制生成一个新进程。老进程叫父进程,复制生成的新进程叫子进程。子进程有自己独立的PCB子,被内核同等调度。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>


int main(void)
{
	pid_t p1 = -1;
	
	p1 = fork();		// 返回2次
	
	if (p1 == 0)
	{
		// 这里是子进程
		printf("子进程, pid = %d.\n", getpid());	 //打印子进程pid	
		printf("hello world.\n");
		printf("子进程, 父进程ID = %d.\n", getppid());  //打印父进程pid
	}
	
	if (p1 > 0)
	{
		// 这里是父进程
		printf("父进程, pid = %d.\n", getpid());  //打印父进程pid
		printf("父进程, p1 = %d.\n", p1);          
	}
	
	if (p1 < 0)
	{
		//出错
	}
	
	return 0;
}

(2)fork函数调用一次会返回2次,返回值等于0的就是子进程,而返回值大于0的就是父进程。
(3)典型的使用fork的方法:使用fork后然后用if判断返回值,并且返回值大于0时就是父进程,等于0时就是子进程。
(4)fork的返回值在子进程中等于0,在父进程中等于本次fork创建的子进程的进程ID。


4.父子进程对文件的操作

(1)**子进程继承父进程中打开的文件,**父进程先open打开一个文件得到fd,然后在fork创建子进程。之后在父子进程中各自write向fd中写入内容。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(void)
{
	// 首先打开一个文件
	int fd = -1;
	pid_t pid = -1;
	
	fd = open("1.txt", O_RD
  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux中,可以使用fork()系统调用来创建父子进程。fork()会创建一个新的进程,该进程是调用进程的副本,称为进程进程和父进程共享代码段、数据段和堆栈段,但是它们有各自独立的地址空间和进程控制块。在fork()调用后,父进程进程会分别执行不同的代码路径,可以通过返回值来区分父进程进程。如果返回值为,则表示当前进程进程,如果返回值大于,则表示当前进程是父进程,返回值为进程进程ID。 ### 回答2: 在Linux系统中,可以通过fork()系统调用来创建一个父进程和一个进程。在fork()调用之前,只有一个进程在运行。调用fork()后,操作系统将复制当前进程的所有资源,包括内存、文件描述符、环境变量等,并将这些资源分配给新的进程。父进程进程是完全独立的进程,它们有不同的进程ID,可以运行不同的代码路径,拥有不同的数据和代码空间。 接下来,我们可以在父进程进程中分别执行不同的操作。一般来说,fork()系统调用返回两次,一次是在父进程中返回进程进程ID,另一次是在进程中返回0。所以我们可以通过返回值来判断当前代码是在父进程还是进程中运行。 下面是一个简单的示例程序,该程序利用fork()创建了一个父进程和一个进程,父进程通过等待进程退出来获取进程退出码。 ``` #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> int main() { int pid = fork(); if (pid == -1) { perror("fork error"); exit(EXIT_FAILURE); } else if (pid == 0) { // child process printf("child process: %d\n", getpid()); exit(EXIT_SUCCESS); } else { // parent process printf("parent process: %d\n", getpid()); int status; wait(&status); printf("child exit status: %d\n", WEXITSTATUS(status)); } return 0; } ``` 该程序首先调用fork()系统调用,创建一个进程。如果fork()调用返回-1,说明创建进程失败。如果fork()调用返回0,说明当前代码在进程中运行,进程输出自己的进程ID,并通过exit()函数退出。如果fork()调用返回一个大于0的值,说明当前代码在父进程中运行,父进程输出自己的进程ID,并通过wait()函数等待进程退出。wait()函数返回一个状态码,我们可以通过WEXITSTATUS(status)来获取进程的退出码。 运行该程序,将会输出以下内容: ``` parent process: 1234 child process: 1235 child exit status: 0 ``` 这表明在这个程序中,父进程进程ID是1234,进程进程ID是1235,进程的退出码是0。 ### 回答3: 在Linux环境下,可以用fork()函数创建一个进程。fork()函数会返回两次,一次在父进程中返回一个进程的PID,一次在进程中返回0。 父进程进程在fork()函数结束后会运行相同的程序代码。因此,在使用fork()函数时,需要通过判断返回值来区分父进程进程。 在父进程中,fork()函数会返回一个非0的进程PID,因此可以使用这个PID来等待进程的终止。可以使用waitpid()来等待进程结束,也可以使用wait()来等待任意进程结束。父进程可以得到进程的退出状态,从而根据进程的执行结果来进行后续操作。 在进程中,fork()函数会返回0。在进程中通常会执行一些特定的任务,例如运行一个程序、执行一些计算或者处理数据等。进程也可以创建自己的进程,这样就形成了一棵进程树。 需要注意的是,在父进程中创建进程时,进程会继承父进程的所有资源,包括打开的文件、信号处理等。因此,在进程中需要小心处理这些资源,以免出现问题。 总的来说,使用fork()函数可以在Linux中创建父子进程。通过这种方式,可以实现多任务并发处理,提高系统的资源利用率和运行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值