通过c中的命名管道传递数组

时间:2014-06-07 12:56:07

标签: c pipe named-pipes

我正在尝试将父进程中的char **传递给子进程。当我尝试打印字符串时,我的程序终止,没有错误......只是终止。这是我的代码:

我从:

开始
int main(int argc, char *argv[])
{
    pid_t pid;
    char **args;
    int i;


    if(argc < 3)
    {
         perror("Argc");
         exit(1);
    }

    args = malloc(argc*sizeof(char *));

    for(i=0; i<argc; i++)
    {
        if( i == (argc-1) )
        {
            args[i] = NULL;
            break;
        }

        args[i] = malloc(strlen(argv[i+1])*sizeof(char));
        strcpy(args[i], argv[i+1]);
        printf("%s\n",args[i]);
    }

    if( server_exists() )
    {
    //pipes
    }

    else
    {       
        pid = fork();

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

        else if( pid == 0 )
        {           
             execl("./jobServer", "jobServer", NULL);           
        }   

        else if( pid > 0 )
        {
            for(i=0; i<argc-1; i++)
            {
                printf("%s\n",args[i]);
            }
            send_args(args, argc);
        }   
    }

    return 0;
}

一个有用的功能:

void send_args(char **args, int argc)
{
    int fd, i;
    char *myfifo = "myfifo";
    int total = 0;

    for(i=0; i<argc-1; i++)
    {
        total += (strlen(args[i])) + 1 ;
        printf("%d %s\n",(strlen(args[i])), args[i]);
    }
    printf("asdf %d\n",total);
    mkfifo(myfifo, 0666);

    fd = open(myfifo, O_WRONLY);
    write(fd, args, sizeof(total));
    close(fd);

    unlink(myfifo);
}

子进程(exec“jobServer”):

#define MAX_BUF 2048

int main(int argc, char *argv[])
{
    int fd,i=0;
    char *myfifo = "myfifo";
    char *buf[MAX_BUF];

    if( !server_exists() ) make_server(getpid());

    fd = open(myfifo, O_RDONLY);
    read(fd, buf, MAX_BUF);

    //I can't print these
    printf("%s\n",buf[0]);
    printf("%s\n",buf[1]);
    printf("%s\n",buf[2]);

    close(fd);

    return 0;
}
你能帮忙吗?提前谢谢!

1 个答案:

答案 0 :(得分:2)

您理解的问题是命名管道就像文件或流一样,因此您可以将字节写入其中。

当你有一个指针数组(或多维数组)时,指针实际上将指向内存中的其他位置(数组外),因此接收应用程序将只遵循这些指针并使用它们中的任何地址地址空间(与发件人的地址空间不同)。

因此,您不能将数组复制到管道/文件/中,而是必须提取所有数据(按照指针)并单独编写。

此外,无论sizeof(total)的实际价值如何,sizeof(int)始终为total(可能为4或8)。