2016-04-23 61 views
1

执行一个程序我有一个包含有C语言编写的内部的功能的程序的二进制文件的样子:如何通过fork和exec

int main() 
{ 
    int a, b; 
    foo(a,b); 
    return 0; 
} 

,现在我想用叉子(执行该程序)和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”程序中的函数的参数是否接收到通过命令行传递给“解算器”程序的变量

+3

你可以阅读[execve']手册(http://man7.org/linux/man-pages/man2/execve.2.html)以了解如何它的工作原理和你必须传递给它的参数。 –

+1

您可能想了解'main()'的参数'argv [0]'提供了什么。 – alk

+1

“*这是一个好方法吗?*”号;-) – alk

回答

1

我相信你正在努力实现类似的东西:

#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将陆续推出与你原来的程序有相同的参数

+0

的参数调用函数foo(a,b)。这正是我想要做的。感谢帮助! –

0

我改变了一些东西。现在,工作程序也从命令行获取参数。并且执行它的计划看起来:

int main(int argc, char* argv[]) 
{ 
pid_t process; 
int a = atoi(argv[1]); 
int b = atoi(argv[2]); 
char *envp[] = {NULL}; 
char *args[] = { "./worker", "a", "b"}; 
process = fork(); 
if(process==0) 
{ 
    if(execve("./worker", args, envp)==-1) 
    printf("The process could not be started\n"); 
} 
return 0; 
} 

还是一样的问题:(