C Linux - 如何从另一个程序执行程序

时间:2014-04-25 07:19:18

标签: c linux operating-system exec fork

我正在尝试执行我从其他程序编写的程序(让我们调用那个程序2)。

我编译program2并具有可执行文件调用client

我想运行program2,为此我创建了进程fork,试图使用exec函数执行program2。

该程序需要运行两个参数。

我用:

execvp("client",arguments)

其中argumentsNULL - 已终止的char* - 数组,而arguments[0]"client"。该程序在exec操作失败,错误为No Such File Or Directory

换句话说,如何使用exec函数从其他程序运行我的代码?

代码:

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

struct Integrals* shm_ptr; 
key_t key;      
int i,status;
int shm_id;
pid_t pid;  
int child_pid[PROCESS];
char  curPid[10];
int curpid;
double calcSegment[SIZE];
int from,to;
double segment;

curpid=getpid();
sprintf(curPid,"%d",curpid);

char* arguments[]={"client",argv[1],curPid,NULL};

signal(SIGUSR1, sig_handler);//"install" the 'sig_handler' func in case ^C signl.

printf("---------->%s",arguments[0]);
key=ftok("\tmp",(char)argv[1][0]);

if( (shm_id=shmget(key,sizeof(Integrals),IPC_CREAT|0600))==-1)
{
    perror("Fail To Allocate Shared Memory");
    exit(1);
}


if((shm_ptr=(Integrals*)shmat(shm_id,NULL,0))<0)
{
    perror("Fail To Attach Memory");
    exit(1);

}


pid=fork();

if(pid<0)
{
    perror("The Fork Failed");
    exit(1);    
}

else if(pid==0)
{
    if(execvp("workspace/hafala/EX2/client",arguments)==-1)
    {
        perror("Faile To Execute 'client.c' Program");
        exit(1);

    }

}

2 个答案:

答案 0 :(得分:0)

尝试使用完整路径而不仅仅是exec名称来调用外部程序。

这看起来像是一个非常简单的可执行文件重定位问题。

至少我会检查那里。另一种解决方案是将客户端应用程序移动到调用者的同一目录中,以更改当前目录上下文。

答案 1 :(得分:0)

我认为错误在第一个参数中,与您指定的程序不匹配

尝试将客户端可执行文件复制到同一目录,并将代码更改为此。

char* arguments[]={"./client",argv[1],curPid,NULL};

else if(pid==0)
{
    if(execvp("./client",arguments)==-1)
    {
        perror("Failed To Execute 'client.c' Program");
        exit(1);
    }

}