Execve给出了糟糕的地址

时间:2016-12-28 14:32:02

标签: c

我对execve命令有一点问题。程序Test应该创建两个子节点,每个子节点都应运行一个execve来加载和运行另一个程序。但我在这两个人身上得到了一个不好的地址。代码如下:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <errno.h>
#include <time.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(){
    int child_1, child_2;

    child_1=fork();
    if(child_1==0){
        char* argv[]={"Test", "Test_1", "NULL"};
        if((execve("Test_1", argv, NULL))<0) perror("execve 1 fail");
        exit(0);
    }else if(child_1<0)perror("error fork");
    else wait(NULL);

    child_2=fork();
    if(child_2==0){
        char* argv1[]={"Test", "Test_2", "NULL"};
        if((execve("Test_2", argv1, NULL))<0) perror("execve 2 fail");
        exit(0);
    }else if(child_2<0)perror("error fork");
    else wait(NULL);
return 0;
}

2 个答案:

答案 0 :(得分:6)

您没有正确终止参数数组:

    char* argv[]={"Test", "Test_1", "NULL"};

"NULL"是字符串文字,与NULL不同。需要使用空指针终止数组。而是做:

    char* argv[]={"Test", "Test_1", (char*)0};

同样,修复另一个参数数组。

答案 1 :(得分:0)

或者您必须更改&#34; NULL&#34;简单地说是NULL。在案例&#34; NULL&#34;您将NULL作为命令行参数。案例NULL没有&#34;意味着参数列表的结尾。