簡體   English   中英

execvp()系統調用未執行

[英]execvp() system call not executing

char *args[41];
char str[41], teststr[41];
const char delimiter[2]=" ";
memcpy(teststr, str, sizeof(str));
args[i]=strtok(teststr, delimiter);
while(args[i]!=NULL)
{
    printf("args[%d]=%s\n", i, args[i]);
    i++;
    args[i]=strtok(NULL, delimiter);
}

這是我用來初始化args []的代碼。

下面的代碼是執行execvp()系統調用。

pid=fork();
if(pid==0)
{
    execvp(args[0], args);
}

當我運行代碼時,execvp運行一些命令。 例如,當我嘗試執行“ ls”命令時,它將起作用,但是當我嘗試運行“ date”命令或“ cd”命令時,它將不起作用。 當我嘗試執行“ cat”命令時,提示符不顯示任何內容,同時也不會顯示任何內容。

看起來您在如何獲取論據方面有問題,盡管由於您不顯示自己的意見,所以很難說出來。 strtok()修改傳遞給它的字符串,因此存儲指向您要修改的字符串的指針看起來很麻煩。

這將做您想要的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define MAX_BUFFER_LEN 1024
#define MAX_ARGS 100

int main(void) {
    char command[MAX_BUFFER_LEN];

    printf("myshell> ");
    fflush(stdout);
    fgets(command, MAX_BUFFER_LEN, stdin); 
    command[strlen(command) - 1] = '\0';

    char * args[MAX_ARGS];
    char * temparg;
    int i = 0;

    temparg = strtok(command, " ");
    while ( temparg ) {
        args[i] = strdup(temparg);
        ++i;
        temparg = strtok(NULL, " ");
    }

    i = 0;
    while ( args[i] != NULL ) {
        printf("Argument %d: %s\n", i + 1, args[i]);
        ++i;
    }

    pid_t my_pid = fork();
    if ( my_pid == 0 ) {
        execvp(args[0], args);
    }

    wait(NULL);

    return EXIT_SUCCESS;
}

輸出:

paul@MacBook:~/Documents/src/scratch$ ./exectest
myshell> cat exectest.c
Argument 1: cat
Argument 2: exectest.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define MAX_BUFFER_LEN 1024
#define MAX_ARGS 100

int main(void) {
    char command[MAX_BUFFER_LEN];

    printf("myshell> ");
    fflush(stdout);
    fgets(command, MAX_BUFFER_LEN, stdin); 
    command[strlen(command) - 1] = '\0';

    char * args[MAX_ARGS];
    char * temparg;
    int i = 0;

    temparg = strtok(command, " ");
    while ( temparg ) {
        args[i] = strdup(temparg);
        ++i;
        temparg = strtok(NULL, " ");
    }

    i = 0;
    while ( args[i] != NULL ) {
        printf("Argument %d: %s\n", i + 1, args[i]);
        ++i;
    }

    pid_t my_pid = fork();
    if ( my_pid == 0 ) {
        execvp(args[0], args);
    }

    wait(NULL);

    return EXIT_SUCCESS;
}

paul@MacBook:~/Documents/src/scratch$ 

為了簡潔起見,省略了一些錯誤檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM