解释一下代码:#include<stdio.h> #include<unistd.h> main( ) { char *arg[] = {"ls", "-l", NULL}; int pid; pid=fork( ); /创建子进程/ switch(pid) { case -1: /创建失败/ printf("fork fail!\n"); exit(1); case 0: /子进程/ execl("/bin/ls","ls","-1",NULL); //execlp("ls", "ls", "-l", NULL); //execle("/bin/ls", "ls", "-l", NULL, NULL); //execv("/bin/ls", arg); //execvp("ls", arg); // execve("/bin/ls", arg, NULL); //上面的六个函数的运行结果都是一样的 printf("exec fail!\n"); exit(1); default: /父进程/ wait(NULL); /等待子进程结束,NULL表示不关注子进程是如何结束的,不需要返回值/ printf("ls completed !\n"); exit(0); } }
时间: 2024-04-04 07:31:51 浏览: 20
这段代码是一个使用fork()和exec()系统调用实现的简单程序,目的是在终端上运行"ls -l"命令。具体的解释如下:
1. 引入头文件<stdio.h>和<unistd.h>。
2. 定义一个字符指针数组arg,初始化为{"ls", "-l", NULL}。这个数组是给exec()系列函数传递参数用的。
3. 定义一个整型变量pid,用于存储fork()函数的返回值。
4. 调用fork()函数,创建一个子进程。fork()函数返回值为0表示子进程,返回值为正整数表示父进程,返回值为-1表示创建失败。
5. 利用switch语句对pid的值进行判断,根据不同的情况执行不同的代码:
- 如果pid等于-1,表示创建子进程失败,输出提示信息后退出程序。
- 如果pid等于0,表示当前进程为子进程。接着调用exec()系列函数来运行"ls -l"命令,这里提供了六种不同的方式来调用exec()函数,都可以实现相同的功能。如果exec()函数调用失败,输出提示信息后退出子进程。
- 如果pid大于0,表示当前进程为父进程。使用wait()函数等待子进程结束,输出提示信息后退出程序。
6. 程序结束。
相关问题
execvp实现shell版本,arg[1] :ls arg[2]: -l arg[3] \n
好的,可以使用以下代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s command [arg1] [arg2] ...\n", argv[0]);
exit(EXIT_FAILURE);
}
if (execvp(argv[1], &argv[1]) == -1) {
perror("execvp failed");
exit(EXIT_FAILURE);
}
return 0;
}
```
在命令行中运行该程序时,需要指定要执行的命令及其参数,例如:
```
./myshell ls -l '\n'
```
其中,`ls` 是要执行的命令,`-l` 是其参数,`'\n'` 是为了在执行完 `ls -l` 后在命令行输出一个换行符。
程序设计。用execl 函数创造进程 1s-1,用execvp 函数创造进程 ps -ef。 提示: 显示当前目录下的文件信息可执行以下语句: (1) execl("/bin/ls", "Is", "-al", NULL) (2) char *arg[] = '"ps", "-ef", NULL): execvp ("ps", arg) ;
可以回答你的问题。对于第一个进程,你可以使用execl函数来创建,代码如下:
```
#include <unistd.h>
#include <stdio.h>
int main() {
while (1) {
execl("/bin/sleep", "sleep", "1", NULL);
}
return 0;
}
```
这个进程会不断地执行sleep命令,每隔一秒钟就会停止执行。
对于第二个进程,你可以使用execvp函数来创建,代码如下:
```
#include <unistd.h>
#include <stdio.h>
int main() {
char *args[] = {"ps", "-ef", NULL};
while (1) {
execvp(args[0], args);
}
return 0;
}
```
这个进程会不断地执行ps命令,显示当前系统中所有进程的详细信息。
请注意,这两个进程会不断地执行,直到你手动结束它们或者重启系统。因此,你可能会需要在执行这些程序之前先备份你的数据。