execvp - 为什么我的程序会退出?

时间:2015-12-19 22:59:11

标签: c fork

我正在执行一个程序,该程序将输入解析为数组并在其上运行函数。代码是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>

// arglist - a list of char* arguments (words) provided by the user
// it contains count+1 items, where the last item (arglist[count]) and
//    *only* the last is NULL
// RETURNS - 1 if should cotinue, 0 otherwise
int process_arglist(int count, char** arglist);

void main(void) {
    while (1) {
        char **arglist = NULL;
        char *line = NULL;
        size_t size;
        int count = 0;

        if (getline(&line, &size, stdin) == -1)
            break;

        arglist = (char**) malloc(sizeof(char*));
        if (arglist == NULL) {
            printf("malloc failed: %s\n", strerror(errno));
            exit(-1);
        }
        arglist[0] = strtok(line, " \t\n");

        while (arglist[count] != NULL) {
            ++count;
            arglist = (char**) realloc(arglist, sizeof(char*) * (count + 1));
            if (arglist == NULL) {
                printf("realloc failed: %s\n", strerror(errno));
                exit(-1);
            }      
            arglist[count] = strtok(NULL, " \t\n");
        }

        if (count != 0) {
            if (!process_arglist(count, arglist)) {
                free(line);
                free(arglist);
                break;
            }
        }
        free(line);
        free(arglist);
    }
    pthread_exit(NULL);
}

我的功能是:

int process_arglist(int count, char** arglist) {
    int i;
    for (i = 0; i < count; i++) {
        //printf("%s\n", arglist[i]);
        execvp(arglist[0], arglist);
    }
}

当刚刚打印出名称(标记)时,它没有终止。但是当我尝试使用execvp时,它会在一次迭代后停止。有人可以告诉我为什么以及该怎么做?

1 个答案:

答案 0 :(得分:2)

这不是一个错误,它应该是它的工作方式。 execvp用新进程替换当前进程,保持一些文件句柄处于打开状态。

如果您要启动新流程,则必须使用fork()并在子流程中调用execvp()

查看fork()execvp()

的手册页