Caracteres C-Junk na saída

Digamos que tenho dois programas.c & saída.c Tudo o que eu quero fazer é enviar algumas cargas/caracteres no formato "half pyramid" para outro usando a função execl ().

entrada.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

#define SIZE 1024

int length;

int main(int argc, char *argv[])
{
    pid_t pid;
    char *target;
    //char payload[length+1];
    char payload[SIZE + 1];
    int status;
    int i = 0;

    if(argc < 2)
    {
        printf("Usage %s <length> <target>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    length = atoi(argv[1]);
    target = argv[2];

    while(i < length)
    {
        pid = fork();

        if(pid != 0)
        {
            waitpid(-1, &status, 0);
            //exit(0);
        }

        if(pid == 0)
        {
            payload[i] = 'A';
            payload[i + 1] = '\0';
            execl(target, target, payload, NULL);
            //printf("%s\n", payload);
        }
        ++i;
    }
    return 0;
}
As passagens comentadas são apenas para depuração. Porque como você pode ver (enquanto tenta), quando você quer apenas imprimi-lo, tudo funciona corretamente.

saída.c (ou se queres um alvo.c')

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char buffer[30];
    strncpy(buffer, argv[1], sizeof(buffer));
    printf("Output: %s\n", buffer);

    return 0;
}

Quando Eu compile a entrada.C como:

gcc input.c -o input

& saída.c:

gcc output.c -o output
Está bem. Agora, está tudo preparado. Digamos que gostaria de enviar uma carga de 6.
./input 6 ./output

mas tudo o que consigo na saída é apenas isto (ou simplesmente com outros personagens de junks):

Output: A
Output: 0A
Output: 0,A
Output: 0,�A
Output: 0,�8A
Output: 0,�8�A

tentei tantas coisas, mas todas falharam e a saída ainda era a mesma, como podem ver acima.

Ficaria muito grato se alguém me pudesse ajudar e, possivelmente, mostrar-me onde está o problema. Pode ser um problema no uso do fork() e execl () funciona em conjunto?

Author: Yeez, 2015-04-16

2 answers

Já percebi, não deves actualizar-te.payload no código do bloco infantil... Aqui está uma solução (não posso testá-la agora):
 while(i < length)
    {
        pid = fork();
        payload[i] = 'A';
        payload[i + 1] = '\0';

        if(pid != 0)
        {
            waitpid(-1, &status, 0);
            //exit(0);
        }

        if(pid == 0)
        {
            execl(target, target, payload, NULL);
            //printf("%s\n", payload);
        }
        ++i;
    }

[sentença não relacionada removida]

Edite (explicações adicionais): payload a actualização deve estar em tanto o código dos pais como o código dos filhos. Se não percebes porquê, posso dar-te mais explicações.

EDIT2 (conforme solicitado). Quer actualizar a carga útil para o próximo processo de criança bifurcada. No seu código, todo o código infantil é substituído por execl() em target Código. Então o fork() é executado apenas pelo primeiro processo pai (O raiz).

Tens de actualizar a carga pelo primeiro pai e torná-la acessível a todas as crianças. Colocá-lo neste bloco também não vai funcionar.
// block only executed by the first parent.
if(pid != 0)
{
    waitpid(-1, &status, 0);
}

Portanto, você deve atualizá-lo em um lugar acessível tanto pelo pai quanto pela criança : depois do fork(), antes do bloco if(pid == 0).

No seu código, você aumenta i no bloco comum, mas o os pais payload nunca são actualizados. Assim, no bloco infantil, pouco antes do execl(), a sua adição 'A\0' no final de uma cadeia Cnão-inicializada.

 5
Author: Amessihel, 2015-04-16 17:07:34
Quando o seu programa se bifurca, cria um novo processo. Este novo processo, após {[[0]}, altera o payload, e executa exec (isto é, executa output, que então morre. Ou seja, sua mudança de carga permanece na criança, e não afeta o processo pai. Só o ++i faz, e é por isso que estás a ver dados não iniciados.

Mova a mudança de carga antes da bifurcação (ou pelo menos fora do bloco só para crianças), para que também esteja no Pai.

 2
Author: che, 2015-04-16 16:31:17