迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

使用 C 语言中的 execlp 函数

作者:迹忆客 最近更新:2023/03/28 浏览次数:

本文将演示关于如何使用 C 语言中的 execlp 函数的多种方法。


使用 execlp 在 C 语言中使用文件名执行新程序

exec 系列函数是作为低级 execve 系统调用的替代 API 提供的,用于管理将新程序加载到进程内存中。这个系列有 6 个独立的函数,它们主要是参数不同而不是结果不同。execlp 函数是给用户指定文件名的选项,程序会在当前 PATH 环境变量列出的目录中搜索。

如果文件名仍然包含斜线,则被视为相对或绝对路径名。在下面的例子中,我们实现了一个行为类似于 shell 的程序。也就是说,它从用户那里获取程序名,并作为一个子进程来执行。父进程等待,一旦子进程返回,控制权就会进入用户输入的下一个迭代。程序应该由用户用Ctrl+D这样的按键终止(取决于操作系统)。注意,有些 shell 命令不能执行,最重要的是,命令行参数没有传递,而程序却打印出 couldn't execute

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "unistd.h"
#include <sys/wait.h>

enum {MAXLINE = 256, MAXARGS = 48};

int main(int argc, char *argv[]) {
    char buf[MAXLINE];
    pid_t pid;
    int status;

    char *str1, *token;

    printf("%% ");
    while (fgets(buf, MAXLINE, stdin) != NULL) {
        if (buf[strlen(buf) - 1] == '\n')
            buf[strlen(buf) - 1] = 0;

        if ((pid = fork()) < 0) {
            perror("fork");
        } else if (pid == 0) {
            execlp(buf, buf, (char *) NULL);
            printf("couldn't execute: %s", buf);
            exit(127);
        }

        if (waitpid(pid, &status, 0) < 0)
            perror("waitpid");
        printf("%% ");
    }

    exit(EXIT_SUCCESS);
}

execlp 是可变函数,因此,它可以接受不同数量的参数。不过第一个和最后一个参数是固定的,代表文件名的指针,而 NULL 则相应地投向 char*。需要注意的是,强制转换 null 指针是函数工作的必备条件,同时也表示变量参数数的结束。总之,第二个位置的参数应该指定程序的命令行参数,其中第一个参数应该是文件名本身。

另外,我们也可以实现前面的例子,能够执行带有参数的命令。在这种情况下,我们利用了 execvp 函数,它将参数列表作为一个数组。同时,我们使用 strtok 来解析用户输入,将每个空格分隔的字符串作为参数传递。结果,我们得到了更接近 shell 程序的仿真。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "unistd.h"
#include <sys/wait.h>

enum {MAXLINE = 256, MAXARGS = 48};

int main(int argc, char *argv[]) {
    char buf[MAXLINE];
    char *args[MAXARGS];
    pid_t pid;
    int status, args_num = 0;

    char *str1, *token;

    printf("%% ");
    while (fgets(buf, MAXLINE, stdin) != NULL) {
        if (buf[strlen(buf) - 1] == '\n')
            buf[strlen(buf) - 1] = 0;

        str1 = strdup(buf);
        for (int j = 0; ; j++, str1 = NULL) {
            token = strtok(str1, " ");
            if (token == NULL)
                break;
            args[j] = token;
            args_num += 1;
            printf("%d: %s\n", j + 1, args[j]);
        }
        free(str1);
        args[args_num] = (char *) NULL;

        if ((pid = fork()) < 0) {
            perror("fork");
        } else if (pid == 0) {
            execvp(args[0], &args[0]);
            printf("couldn't execute: %s", buf);
            exit(127);
        }

        if (waitpid(pid, &status, 0) < 0)
            perror("waitpid");
        printf("%% ");
    }

    exit(EXIT_SUCCESS);
}

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

在 C 语言中使用位移操作

发布时间:2023/05/07 浏览次数:132 分类:C语言

本文演示了如何在 C 语言中使用位移操作。在 C 语言中使用 << 运算符将数字向左移位的方法

在 C 语言中使用互斥锁

发布时间:2023/05/07 浏览次数:145 分类:C语言

本文演示了如何在 C 语言中使用互斥锁。使用 pthread_mutex_t 类型和 pthread_mutex_lock 函数来守护代码的关键部分

在 C 语言中使用 nanosleep 函数

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文演示了如何在 C 语言中使用 nanosleep 函数。在 C 语言中使用 nanosleep 函数用高分辨率定时器暂停程序执行

在 C 语言中使用 crypt 函数

发布时间:2023/05/07 浏览次数:177 分类:C语言

本文演示了如何使用 C 语言中的加密函数。使用 crypt 函数对密码进行哈希存储 crypt 实际上是一个由四个函数组成的系列

在 C 语言中实现字典

发布时间:2023/05/07 浏览次数:196 分类:C语言

本文介绍了如何在 C 语言中实现字典。使用 hcreate、hsearch 和 hdestroy 在 C 语言中实现字典功能

在 C 语言中实现凯撒密码

发布时间:2023/05/07 浏览次数:77 分类:C语言

本文介绍了如何在 C 语言中实现凯撒密码。在 C 语言中实现凯撒密码处理常量字符串的方法

在 C 语言中实现交换函数

发布时间:2023/05/07 浏览次数:120 分类:C语言

本文演示了如何在 C 语言中实现交换函数。使用临时变量在 C 语言中实现交换函数的方法

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便