Ошибка, возникшая при разветвлении - PullRequest
0 голосов
/ 09 октября 2011

У меня есть следующий код, который разветвляет два новых процесса, чтобы взять содержимое стандартного вывода одного и сохранить его в файл.Он отлично работает и сохраняет файл, но после того, как он возвращает следующую строку в вызывающей функции (независимо от того, что это), выдает ошибку EXC_BAD_ACCESS.Почему?

void test(vector<string> inp,int i){
    int fds[2]; // file descriptors
    long count;  // used for reading from stdout
    int fd;     // single file descriptor
    char c;     // used for writing and reading a character at a time
    pid_t pid;  // will hold process ID; used with fork()

    pipe(fds);

    // child process #1.
    fd = open((inp[i+1]).c_str(), O_RDWR | O_CREAT, 0666);
    if (fork() == 0) {
        if (fd < 0) {
            return;
        }

        dup2(fds[0], 0);

        // Don't need stdout end of pipe.
        close(fds[1]);

        // Read from stdout...
        while ((count = read(0, &c, 1)) > 0)
            write(fd, &c, 1); // Write to file.

        exit(0);
        // child process #2
    } else if ((pid = fork()) == 0) {
        dup2(fds[1], 1);

        // Don't need stdin end of pipe.
        close(fds[0]);

        // Output contents of the given file to stdout.
        char **arguments = getArguments(inp[i]);
        execvp(arguments[0], arguments);
        perror("execvp failed");
        exit(0);
        // parent process
    } else {
        waitpid(pid, NULL, 0);
        close(fds[0]);
        close(fds[1]);
    }
}

1 Ответ

0 голосов
/ 09 октября 2011

Это хорошо работает для меня:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/wait.h>

void test(/*vector<string> inp,int i*/){
    int fds[2]; // file descriptors
    long count;  // used for reading from stdout
    int fd;     // single file descriptor
    char c;     // used for writing and reading a character at a time
    pid_t pid;  // will hold process ID; used with fork()

    pipe(fds);

    // child process #1.
    fd = open(/*(inp[i+1]).c_str()*/"/tmp/output", O_RDWR | O_CREAT, 0666);
    if (fork() == 0) {
        if (fd < 0) {
            return;
        }

        dup2(fds[0], 0);

        // Don't need stdout end of pipe.
        close(fds[1]);

        // Read from stdout...
        while ((count = read(0, &c, 1)) > 0)
            write(fd, &c, 1); // Write to file.

        _exit(0);
        // child process #2
    } else if ((pid = fork()) == 0) {
        dup2(fds[1], 1);

        // Don't need stdin end of pipe.
        close(fds[0]);

        // Output contents of the given file to stdout.
        char **arguments = new char*[2];/*getArguments(inp[i]);*/
        arguments[0]=(char*)"/bin/bash";
        arguments[1]=0;
        execvp(arguments[0], arguments);
        perror("execvp failed");
        _exit(0);
        // parent process
    } else {
        waitpid(pid, NULL, 0);
        close(fds[0]);
        close(fds[1]);
    }
}

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

Попробуйте сказать, где именно ваша ошибка появляется, или показать больше вашей программы, чтобы я мог попытаться повторить ваши условия.

...