解释一下代码:#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 15:31:51 浏览: 68
C标准库函数集
5星 · 资源好评率100%
这段代码是一个使用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. 程序结束。
阅读全文