【问题标题】:Using "execv" or "execvp" to morph a program to isPrime?使用“execv”或“execvp”将程序变形为 isPrime?
【发布时间】:2015-04-01 14:32:22
【问题描述】:

我在下面有一个名为“prime.c”的程序:

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

int isPrime(int number);
void Morph(char *number);

int main(int argc, char *argv[])
{
        int i;

        int number;

        if (argc < 2) {
            printf("Returning 2");
            return(2);
        }
        else number = atoi(argv[1]);
        if (isPrime(number)) {
                exit(1);
        }
        exit(0);
}


/*
Purpose: check if the input number is a prime number
input:
number - the number to be checked

return:
0 - if the number is not a prime number
1 - if the number is a prime number
*/
int isPrime(int number)
{
        int i;
        for(i = 2; i*i < number; i++) {
                usleep(100);
                if (number % i == 0) {
                        printf("%d is not a prime number!",number);
                        return(0);
                }
        }
        printf("%d is a prime number!",number);
        return(1);
}

void Morph(char *number)
{
        execvp(isPrime.exe,number);            
}

它接受一个数字并检查它是否是质数。我们将创建一个名为“isPrime.exe”的可执行文件,我使用“gcc -o isPrime.exe prime.c -lm”完成了它,一切都运行良好。下一步是我卡住的地方,我们要创建一个函数 Morph(char *number),它接受一个字符串作为数字,并使用 execv 或 execvp 将程序变形为 isPrime 程序。我已经开始创建 morph 函数但是我无法让它工作,感谢任何帮助!

【问题讨论】:

  • 从阅读reference of the functions 开始可能是个好主意。
  • 您缺少文件路径周围的双引号。
  • 我已经阅读了它们,但我仍然遇到问题
  • 不确定是否是同一个问题,但上次我使用 exec 它没有包含文件名参数,所以我不得不将所有 argv[1] 更改为 argh[0]
  • 如果输入的数字是4,那么这个算法'isPrime()'不能提供正确的答案

标签: c executable


【解决方案1】:

如果您查看the reference,您会看到例如execvp 函数将字符串作为第一个参数,将argv 样式数组作为第二个参数。

第一个参数是要运行的可执行文件的路径(相对于当前进程的当前工作目录,或绝对路径)。第二个参数将成为新程序中的argv 参数。

假设您的isPrime.exe 与当前程序位于同一目录中,那么您可以这样称呼它:

char *primeArgv[] = {
    "isPrime.exe",  // First argument is the name of the program
    number,         // The actual first argument
    NULL,           // Array must be `NULL` terminated
};

execvp("isPrime.exe", primeArgv);

【讨论】:

  • 好的,这成功了!但是我不明白的是,我们假设要在 prime.c 内部定义和运行 Morph 函数,即 isPrime.exe,所以它基本上是在变形本身?
  • @user3373360 你了解递归的概念吗?这也是一样的,但使用的是程序而不是函数。
  • 是的,我知道这是一种递归形式,但是当我运行程序时,它似乎仍然只运行一次。创建可执行文件后,我运行“./isPrime.exe 1535068679”,它只检查数字,说它不是质数,然后程序退出。是不是应该不停的运行,重复上面的步骤?
  • @user3373360 atoi 函数返回一个 int,它在几乎所有平台上都是 32 位的,即使在 64 位系统上也是如此。所以你传递的数字太大了,atoi 将无法处理它。请改用strtoll (or strtol)
  • 好的,在这种情况下我将如何使用 strtoll? 'Morph(strtoll(什么参数?));'
猜你喜欢
  • 1970-01-01
  • 2012-12-05
  • 2023-03-24
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多