首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试从子对象的stdout读取时,简单的多个子对象执行分支分段错误

尝试从子对象的stdout读取时,简单的多个子对象执行分支分段错误
EN

Stack Overflow用户
提问于 2014-10-01 10:41:58
回答 1查看 387关注 0票数 0

我设置了一个简单的fork示例来派生和执行2个子进程,然后通过管道读取它们的输出,但是我发现了一个段错误(出现在close(Pipingi);上),并且找不到原因。参见下面的代码:

代码语言:javascript
复制
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int reader(int *piping[]) {
    char readstring[50];
    char readstring2[50];
    FILE *outPut;
    FILE *outPut2;
    outPut = fdopen(piping[0][0], "r");
    outPut2 = fdopen(piping[1][0], "r");
    fgets(readstring, sizeof(readstring), outPut);
    fgets(readstring2, sizeof(readstring2), outPut2);
    printf("%s\n", readstring);
    printf("%s\n", readstring2);
    return 0;
}

int main(void) {
    int i;
    int j;
    int pid;
    int **piping = malloc(sizeof(int*) *2);
    for(i = 0; i < 2; ++i) {
        piping[i] = malloc(sizeof(int) *2); 
    }   
    for(j = 0; j < 2; ++j) {
        pipe(piping[j]);
        if((pid = fork()) == -1)   
            fprintf(stderr, "error reading pipe\n");
            exit(1);
        } else if(pid == 0) {
            //child
            //close read pipes dup2 write pipes to stdout
            //then close old write pipes
            close(piping[j][0]);
            if(dup2(piping[j][1], 1) == -1) {
                fprintf(stderr, "error dup2");
                exit(2);
            }
            close(piping[j][0]);
            close(1);
            if(execlp("./playex", "playex", NULL)) {
                fprintf(stderr, "exec error\n");
            }
        } else {
            //parent
            close(piping[j][1]);
        }
    }
    reader(piping);
}

上面是管道和执行人员应该去读的主要函数,下面我有它运行的基本程序。

代码语言:javascript
复制
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
    fprintf(stdout, "go\n");
}

我已经尝试过修复这个片段错误,但没有成功,请帮我定位并修复这个问题。

EN

回答 1

Stack Overflow用户

发布于 2014-10-01 11:37:24

您的主要问题是(在您编辑问题以隐藏最初显示的内容之前)您编写的内容超出了管道数组的范围:

代码语言:javascript
复制
for(i = 0; i < 2; ++i) {
    piping[i] = malloc(sizeof(int) *2); 
}   
for(j = 0; j < 2; ++j) {
    pipe(piping[i]);

您是在j上索引第二个循环,而不是在i上,所以您使用的是未分配的piping[2]。冲洗,然后重复。

您可以通过删除ij的当前定义并使用以下命令来避免错误:

代码语言:javascript
复制
for (int i = 0; i < 2; ++i) {
    piping[i] = malloc(sizeof(int) *2); 
}   
for (int j = 0; j < 2; ++j) {
    pipe(piping[i]);

现在,i在第二个循环中是未定义的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26133328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档