如何通过fork和exec执行程序

3
我有一个二进制文件,里面包含了一个用C语言写的程序,其中的函数如下所示:
int main()
{
    int a, b;
    foo(a,b);
    return 0;
}

现在我想通过在另一个名为“solver”的程序中使用fork()和execve()来执行该程序。

int main(int argc, char* argv[])
{
     pid_t process;
     process = fork();
     if(process==0)
     {
         if(execve(argv[0], (char**)argv, NULL) == -1)
         printf("The process could not be started\n");
     }
     return 0;
}

这是个好方法吗?因为它可以编译,但我不确定“worker”程序内函数的参数是否接收由命令行传递给“solver”程序的变量。


3
你可以阅读execve命令的手册了解它是如何工作以及需要传递哪些参数。 - Kerrek SB
1
您可能想了解一下main()函数的参数argv[0]提供了什么信息。 - alk
1
这是一个好的方式吗?不是。;-) - alk
你想要使用与第一个程序完全相同的参数来启动“work”吗? - jdarthenay
确实。我想要启动它,并在主程序中传递参数调用函数foo(a,b)。 - Michał Habigier
1个回答

4
我相信您正在尝试实现类似这样的功能:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>

static char *sub_process_name = "./work";

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

    process = fork();

    if (process < 0)
    {
        // fork() failed.
        perror("fork");
        return 2;
    }

    if (process == 0)
    {
        // sub-process
        argv[0] = sub_process_name; // Just need to change where argv[0] points to.
        execv(argv[0], argv);
        perror("execv"); // Ne need to check execv() return value. If it returns, you know it failed.
        return 2;
    }

    int status;
    pid_t wait_result;

    while ((wait_result = wait(&status)) != -1)
    {
        printf("Process %lu returned result: %d\n", (unsigned long) wait_result, status);
    }

    printf("All children have finished.\n");

    return 0;
}

./work 将使用与您原始程序相同的参数启动。


这正是我想做的。谢谢你的帮助! - Michał Habigier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接