C管道分割故障

时间:2011-10-26 14:34:35

标签: c segmentation-fault pipe

我有以下代码

    int loopval;
char *message = "D";

//

//KICK OUT THE BAD CALLS
    if(argc != 5)
        terminate("INVALID ARGUEMENTS");
//set arguements
    int num_producers;
        num_producers = atoi(argv[1]);
    int num_consumers;
        num_consumers = atoi(argv[2]);
    int items_per_producer; 
        items_per_producer = atoi(argv[3]);
    int max_in_pipe;
        max_in_pipe = atoi(argv[4]);

    ///set up the pipe
        int fd[2];
        pipe(fd);
    ////



//create producers and consumers arrays
    int producers_return_vals[num_producers];
    pthread_t producers[num_producers];

    int consumers_return_vals[num_consumers];
    pthread_t consumers[num_consumers];

//create producers threads
    for(loopval = 0; loopval < num_producers; loopval++)
    {
        producers_return_vals[loopval] = pthread_create( &producers[loopval], NULL, produce, (void*)message);
    }
//create consumers threads
    for(loopval = 0; loopval < num_consumers; loopval++)
    {
        consumers_return_vals[loopval] = pthread_create( &consumers[loopval], NULL, consume, (void*)message);
    }
//join producers
    for(loopval = 0; loopval < num_consumers; loopval++)
    {
        pthread_join(producers[loopval], NULL);
    }
//join consumers
    for(loopval = 0; loopval < num_producers; loopval++)
    {
        pthread_join(consumers[loopval], NULL);
    }

    exit(0);

消费者和生产者线程现在是同样的道具

    void *consume(void *ptr)
{
    puts("HELLO FROM Consumer");
}

当我致电pipe(fd)时,当线程加入* / EDIT *时,我会遇到分段错误编辑。 谁能告诉我为什么?

2 个答案:

答案 0 :(得分:1)

要检查的第一件事是来自pthread_create调用的返回值,你要存储它们,但是从不检查线程是否真正启动了。

如果pthread_create失败,那么pthread_t将是垃圾,会崩溃pthread_join

编辑:

实际上要做的第一件事是使用-Werror -Wall进行编译,因为我认为你不能像那样声明数组。

这应该是C代码,所以在所有代码之前移动变量的所有声明。这应该突出可能破坏事情的问题 - 你不能像这样在堆栈上分配可变大小的数组。如果需要可变大小的数组,则需要malloc堆上的空间。

答案 1 :(得分:0)

好的问题不在管道中......但在实际声明中:

int producers_return_vals[num_producers];
pthread_t producers[num_producers];

通常动态分配数组使用_alloca调用;如果alloca调用是错误的(它往往是在令人惊讶的大量平台上)或者如果你的编译器不支持动态分配(你正在使用哪个版本的C编译器?)那么你可能会遇到一个SIGSEG ......确保您使用的是支持c99的编译器,因为这是动态分配可用的地方。