如何处理execvp中的错误?

尼古拉斯·R。

我编写了一个小程序(带有来自SO的代码),它可以促进printenv | sort | less现在,我想实现错误处理,我从execvp开始。只是检查返回值还有什么?AFAIK我只是检查此函数中的返回值是否为0 return execvp (cmd [i].argv [0], (char * const *)cmd [i].argv);那是对的吗?

#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
struct command
{
    const char **argv;
};
/* Helper function that spawns processes */
int spawn_proc (int in, int out, struct command *cmd) {
    pid_t pid;
    if ((pid = fork ()) == 0) {
        if (in != 0) {
            dup2 (in, 0);
            close (in);
        }
        if (out != 1) {
            dup2 (out, 1);
            close (out);
        }
        return execvp (cmd->argv [0], (char * const *)cmd->argv);
    }
    return pid;
}
/* Helper function that forks pipes */
int fork_pipes (int n, struct command *cmd) {
    int i;
    int in, fd [2];
    for (i = 0; i < n - 1; ++i) {
        pipe (fd);
        spawn_proc (in, fd [1], cmd + i);
        close (fd [1]);
        in = fd [0];
    }
    dup2 (in, 0);
    return execvp (cmd [i].argv [0], (char * const *)cmd [i].argv);
}

int main (int argc, char ** argv) {
    int i;
    if (argc == 1) { /* There were no arguments */
        const char *printenv[] = { "printenv", 0};
        const char *sort[] = { "sort", 0 };
        const char *less[] = { "less", 0 };
        struct command cmd [] = { {printenv}, {sort}, {less} };
        return fork_pipes (3, cmd);
    }
    if (argc > 1) { /* I'd like an argument */

        if (strncmp(argv[1], "cd", 2) && strncmp(argv[1], "exit", 2)) {
            char *tmp;
            int len = 1;
            for( i=1; i<argc; i++)
            {
                len += strlen(argv[i]) + 2;
            }
            tmp = (char*) malloc(len);
            tmp[0] = '\0';
            int pos = 0;
            for( i=1; i<argc; i++)
            {
                pos += sprintf(tmp+pos, "%s%s", (i==1?"":"|"), argv[i]);
            }
            const char *printenv[] = { "printenv", 0};
            const char *grep[] = { "grep", "-E", tmp, NULL};
            const char *sort[] = { "sort", 0 };
            const char *less[] = { "less", 0 };
            struct command cmd [] = { {printenv}, {grep}, {sort}, {less} };
            return fork_pipes (4, cmd);
            free(tmp);
        } else if (! strncmp(argv[1], "cd", 2)) { /* change directory */
            printf("change directory to %s\n" , argv[2]);
            chdir(argv[2]);
        } else if (! strncmp(argv[1], "exit", 2)) { /* change directory */
            printf("exit\n");
            exit(0);
        }
    }
    exit(0);
}
Aracthor

查看手册execvp将过程的程序映像更改为另一个。因此,如果根本没有返回值,则它显然将为-1,因为它显然将失败。

对于任何syscall或调用syscall的函数,使用带有设置errno的execvp来设置适当的错误代码,您可以将其与perror一起使用以了解函数失败的原因。(顺便说一句,您应该对任何系统调用执行相同的操作:至少是fork,pipe和dup2。)

然后,如果通过“错误处理”来表示要处理所启动程序中的错误,则可以使用wait或waitpid进行处理它可以让您知道程序如何结束,返回值,是否以信号结束,是否以一个信号结束等等。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何处理承诺中的错误?

来自分类Dev

如何处理淘汰订阅中的错误

来自分类Dev

如何处理Shapely中的舍入错误

来自分类Dev

如何处理GRequests中的错误?

来自分类Dev

如何处理Retrofit 2.0中的错误

来自分类Dev

如何处理R降价中的错误?

来自分类Dev

如何处理Angular组件中的错误

来自分类Dev

如何处理NestJS中的TypeORM错误?

来自分类Dev

如何处理python中的递归错误?

来自分类Dev

如何处理fetch()中的错误请求

来自分类Dev

如何处理python中的错误?

来自分类Dev

如何处理Haskell中的createProcess错误?

来自分类Dev

如何处理承诺中的错误?

来自分类Dev

如何处理多个流中的错误?

来自分类Dev

如何处理mio中的错误?

来自分类Dev

如何处理python中的“回溯”错误?

来自分类Dev

如何处理spring集成中的错误

来自分类Dev

如何处理 Kafka Consumer 中的错误

来自分类Dev

如何处理 Django 中的错误

来自分类Dev

如何处理批处理文件中的sqlplus错误

来自分类Dev

再处理中如何处理403 HTTP错误?

来自分类Dev

如何处理布线错误和通用导轨中的错误

来自分类Dev

如何处理ETIMEDOUT错误?

来自分类Dev

如何处理OffsetOutOfRangeException错误?

来自分类Dev

如何处理RapidXml错误?

来自分类Dev

如何处理交易错误?

来自分类Dev

如何处理导入错误?

来自分类Dev

如何处理OffsetOutOfRangeException错误?

来自分类Dev

如何处理交易错误?