【问题标题】:C Linux - How to execute program from another program [duplicate]C Linux - 如何从另一个程序执行程序[重复]
【发布时间】:2014-06-10 18:47:53
【问题描述】:

我正在尝试执行我从另一个程序编写的程序(我们称之为 program2)。

我编译 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);

    }

}

【问题讨论】:

  • 程序为什么会失败?检查错误号。
  • 程序在“没有这样的文件或目录”中失败
  • 给我们一个strace -s 200 -f -o ./program1 输出...
  • 您的 PATH 中是否有一个名为 client 的程序?
  • 客户端是一个可执行文件,位于当前程序(试图运行该程序的程序)的同一目录中,我需要添加什么路径?以及如何?

标签: c linux operating-system exec fork


【解决方案1】:

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

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

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

【讨论】:

  • 客户端程序在同一目录下。因为我使用 execvp(".",arguments) 现在问题是“权限被拒绝”我尝试在程序 2“chmod +x 客户端”上执行但仍然是相同的权限错误
  • 权限被拒绝可能取决于运行您正在开发的进程的用户无法“读取”被调用(客户端)程序的事实。最终尝试使用 chmod o+r 或确保您的用户是组所有者的一部分的所有者。
  • 这是我通过运行 ls - l: prog 1:(我试图运行 prog 2) 获得的许可:-rwxrwxr-x 1 prog 2:(客户端) -rwxr- xr-x 1
  • 抱歉这个愚蠢的问题,您是否尝试将其称为 execvp("./client",arguments) ?
【解决方案2】:

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

尝试将client可执行文件复制到同一目录并将代码更改为这个。

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);
    }

}

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多