进程控制实验:
在linux下面使用c语言利用系统调用fork(), execl(), exit(), wait()
fork()用来复制进程
int fork() turns a single process into 2 identical processes, known as the parent and the child. On success, fork() returns 0 to the child process and returns the process ID of the child process to the parent process. On failure, fork() returns -1 to the parent process, sets errno to indicate the error, and no child process is created.
execl()调用外部命令
execl stands for execute and leave which means that a process will get executed and then terminated by execl.
exit()
int exit(int status) - terminates the process which calls this function and returns the exit status value. Both UNIX and C (forked) programs can read the status value.
wait()等待子进程执行结束
int wait (int *status_location) - will force a parent process to wait for a child process to stop or terminate. wait() return the pid of the child or -1 for an error. The exit status of the child is returned to status_location.
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
int main() {
printf("main");
pid_t pid;
pid = fork();
// son process create here, exact copy from parent process
// son process will execute the main funciton after parent process
if(pid<0) {
printf("return");
return 0;
}
if(pid==0) {
printf("I am the child, my pid is %d\n", getpid());
}else {
printf("I am the parent, my pid is %d, my child pid is%d\n", getpid(), pid);
}
// sleep(6);
}
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
void main() {
// execl("/bin/echo", "echo", "I am in execl", (char*)0);
pid_t pid;
int status = -10;
pid=fork();
if(pid==0) {
printf("i am in son proc\n");
printf("pid = %d\n", getpid());
int t = wait(&status);
printf("t = %d\n", t);
printf("status = %d\n", status);
//子进程下面没有子进程,wait返回-1,status也未变化
sleep(3);
}else {
//wait(&status) 返回子进程的pid, status为执行exit(5)的一个值
// 当然不为5, WEXITSTATUS(status)返回值为5
// sleep(3);
// wait()会等待子进程执行结束,然后回过来的执行父进程
printf("i am in father proc\n");
int t = wait(&status);
printf("t = %d\n", t);
printf("status = %d\n", status);
printf("WEXITSTATUS(status)=%d\n",WEXITSTATUS(status));
}
exit(5);
}
分享到:
相关推荐
总的来说,这些实验涉及了Linux进程控制的关键元素: 1. **fork**: 创建新进程,子进程与父进程几乎完全相同,但拥有独立的PID。 2. **vfork**: 创建子进程,共享父进程的地址空间,提高了创建效率,但限制了父进程...
在Linux操作系统中,进程控制是系统管理的核心部分,它涉及到如何创建、管理、通信和终止进程。本主题“LINUX进程控制编程”旨在深入探讨这些概念,并教你如何在实际编程中应用它们。以下是对这个主题的详细阐述: ...
在上机指导书中,通过分析`systemtest.c`和`6-3.c`等代码示例,你可以学习如何使用`fork()`创建子进程,`execl()`执行新的程序,以及如何在子进程和父进程中分别处理逻辑。例如,`6-3.c`程序展示了如何在子进程中...
在Linux中,可以通过`fork()`函数创建新的进程,`fork()`返回两次,一次在父进程中返回新进程的PID(进程标识符),一次在子进程中返回0。另外,`exec()`系列函数(如`execl()`, `execv()`, `execvp()`等)用于替换...
在Linux和Unix操作系统中,`fork()`函数是创建新进程的核心机制。`fork()`编程是系统调用的一个重要部分...同时,`fork()`与其他进程控制函数(如`wait()`, `exec()`等)的结合使用,能实现更复杂的进程间交互和控制。
例如,`unistd.h`包含了如`fork()`、`exec*()`系列函数的声明,`sys/wait.h`则包含了等待子进程结束的`waitpid()`函数的声明。 #### 2. 使用`fork()`创建子进程 在主进程中调用`fork()`函数可以创建一个新的进程,...
在Linux中,控制进程的主要方法包括创建新进程、终止进程以及父子进程间的通信等。 1. **创建新进程**:主要通过`fork()`系统调用来实现。`fork()`创建一个与父进程几乎完全相同的子进程,子进程继承了父进程的数据...
本实验主要关注与进程控制相关的四个关键系统调用:`fork`、`exec`、`exit`和`wait`,以帮助理解进程的状态变迁和调度。 1. **fork系统调用**: `fork()`用于创建一个新的进程,即父进程的副本。在调用`fork()`后...
通过学习和分析这段代码,开发者可以更深入地理解操作系统如何管理和控制进程,这对于系统编程和性能优化都是非常有价值的。 为了调试和分析这个C语言进程管理器,我们需要查看源代码文件"Process"。这个文件可能...
Linux提供了丰富的系统调用接口,如`fork`、`exec`、`wait`、`exit`、`clone`等,以及C库函数如`system`、`popen`、`pclose`等,供程序员进行进程管理。 总之,Linux进程编程涵盖了系统资源的分配、进程间的通信与...
【Linux 进程通信】 ...- **实时调度策略**:用于实时应用,可以更精细地控制进程的调度。 理解这些基本概念和系统调用是编写高效、可靠的多进程应用程序的基础,它们使得Linux成为一个强大而灵活的多任务操作系统。
在这个主题中,我们将深入探讨几个关键的Linux进程控制函数,包括fork()、exec家族、wait()和exit(),并提供实例来解释它们如何协同工作。 首先,`fork()`函数是创建新进程的基础。当一个进程调用`fork()`时,操作...
实验涉及的关键技术包括Linux命令、进程创建、管理和删除,特别是fork、exec、exit、pause和wait等系统调用,以及VIM编辑器的使用。 在Linux中,进程的创建是通过fork系统调用来实现的。`fork()`调用成功会创建一个...
在Linux环境下,这通常涉及`fork()`、`exec()`、`wait()`和`signal()`等系统调用。`fork()`用于创建新的进程,`exec()`用于替换当前进程的执行体,加载新的程序;`wait()`则用于父进程等待子进程结束;`signal()`...
本篇主要探讨了Linux C函数在进程管理方面的应用,包括进程创建、进程通信、进程同步与互斥、进程控制等核心概念。 一、进程创建 在Linux中,创建新进程最常用的方法是使用`fork()`函数。`fork()`会创建一个与调用...
2. **进程执行**:创建进程后,我们可以使用`exec()`系列函数(如`execl()`, `execlp()`, `execle()`, `execv()`, `execvp()`等)来替换进程的内存空间,使得进程执行新的程序。这些函数接收不同的参数,但基本思路...
7. **进程控制**:`fork`用于创建子进程,`exec`系列函数(如`execl`, `execlp`, `execle`, `execv`, `execvp`, `execvpe`)用于在进程中执行新的程序。`wait`和`waitpid`用于等待子进程结束并获取其退出状态。 8. *...
Linux 进程管理涉及创建、执行、监控和控制进程的能力。进程是 Linux 操作系统中最基本的单元之一,通过进程可以实现并发处理,提高系统的整体性能。进程操作函数提供了丰富的接口来管理进程,如创建新进程、执行...
在这个实验中,学生将学习如何在Linux环境下使用特定的系统调用来管理和控制父子进程之间的交互。 首先,实验的目标是让学生掌握以下几个关键知识点: 1. **获取进程ID**:使用`getpid()`系统调用可以获取当前进程...