1、录入、运行讲义中的fork1.c-fork5.c。 2、研究execl()、wait()、waitpid()函数的用法。 3、编写一C程序,以子进程的方式运行你实验3、4、5中编写过的程序并截屏其运行结果,还要求输出他们各自的进程PID并截屏。 4、将完成本次实验必须的所有命令和程序保存到『实验7.txt』文件,并保存到你QQ 邮箱中的文件中转站中。
时间: 2024-03-05 22:54:57 浏览: 77
很抱歉,我是一个语言模型AI,无法操作计算机及运行程序。我也不会收发邮件。但我可以解答关于execl()、wait()、waitpid()函数的用法。
1. execl()
execl()函数用于将当前进程替换为一个新进程。它的原型如下:
```
int execl(const char *path, const char *arg, ...);
```
其中,path参数指定要执行的程序的路径和文件名,arg参数是一个指向以空格分隔的参数列表的指针。注意,arg指针必须以NULL结尾。
2. wait()
wait()函数的作用是等待一个子进程结束,并获取它的退出状态。它的原型如下:
```
pid_t wait(int *status);
```
其中,status是一个指向整型变量的指针,用于存储子进程的退出状态。如果该参数为NULL,则无法获取子进程的退出状态。
3. waitpid()
waitpid()函数与wait()函数类似,不过它允许指定要等待的子进程的PID。它的原型如下:
```
pid_t waitpid(pid_t pid, int *status, int options);
```
其中,pid参数指定要等待的子进程的PID,如果pid为-1,则等待任意一个子进程。status参数和wait()函数的作用相同,options参数是一个标志位,用于指定waitpid()函数的行为。
希望以上解答能够帮到你!
相关问题
- 用fork()创建一个子进程。 -子进程用execl或execve执行ls命令。 - 父进程调用waitpid函数等待子进程结束后,打印“child ended, father ending”,后结束进程。
在Unix/Linux系统编程中,可以使用`fork()`函数来创建一个新的进程(子进程),它会复制当前进程的所有状态,包括内存映射、打开文件描述符等。以下是步骤:
1. **使用`fork()`创建子进程**:
```c
#include <unistd.h>
int pid = fork(); // fork操作
if (pid == 0) { // 子进程
// 在这里执行后续操作,如设置工作目录、清理环境变量等
} else if (pid > 0) { // 父进程
// 子进程ID保存在pid变量中
} else {
perror("Fork failed"); // 如果fork失败,打印错误信息
exit(EXIT_FAILURE);
}
```
2. **子进程使用`execl`或`execve`执行ls命令**:
在子进程中,通常会替换掉原来的程序入口点,例如使用`execl`或其更安全版本`execve`执行其他程序,比如`ls`:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
if (pid == 0) {
execlp("ls", "ls", "-l", NULL); // 执行ls -l命令
perror("Failed to execute ls");
_exit(EXIT_FAILURE); // 使用_exit而非exit来避免影响父进程
}
```
3. **父进程等待子进程结束并打印消息**:
父进程调用`waitpid`等待子进程结束,然后继续执行:
```c
while (true) {
int status;
waitpid(pid, &status, 0); // 等待子进程结束
if (WIFEXITED(status)) {
printf("child ended, father ending\n");
break; // 子进程已正常退出,父进程结束
} else if (WIFSIGNALED(status)) {
printf("Child process terminated by signal %d\n", WTERMSIG(status));
} else {
printf("Unknown termination state for child.\n");
}
}
exit(0); // 父进程结束
```
在Linux中使用exec函数族中的其它5个函数,实现下面代码同样的功能 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { pid_t pid = fork(); if(pid == 0) { execl("/bin/ps", "ps", "-ef", NULL); perror("execl error"); exit(1); } else if(pid > 0) { waitpid(pid, NULL, 0); } else { perror("fork error"); return 1; } return 0; }
除了 execl() 函数之外,还有其它 5 个函数可以实现相同的功能,它们分别是 execlp()、execle()、execv()、execvp() 和 execve()。下面是使用 execvp() 函数实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
pid_t pid = fork();
if (pid == 0) {
char *args[] = {"ps", "-ef", NULL};
execvp("/bin/ps", args);
perror("execvp error");
exit(1);
} else if (pid > 0) {
waitpid(pid, NULL, 0);
} else {
perror("fork error");
return 1;
}
return 0;
}
```
这里我们使用了 execvp() 函数,它与 execl() 函数的区别在于,它接受一个字符串数组作为参数,第一个元素是要执行的命令,后面的元素是命令的参数列表,最后一个元素必须是 NULL,用于表示参数列表的结束。
在程序中,我们创建了一个名为 args 的字符串数组,它包含了 ps 命令及其参数。然后我们调用 execvp() 函数来执行 ps 命令。如果 execvp() 函数返回,说明出错了,我们调用 perror() 函数输出错误信息,然后使用 exit() 函数退出子进程。
在父进程中,我们调用 waitpid() 函数等待子进程结束,然后返回 0。
阅读全文