C 管道分段故障

标签 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*/EDIT*。 谁能告诉我为什么?

最佳答案

首先要检查的是 pthread_create 调用的返回值,您正在存储它们,但从未检查线程是否实际启动。

如果 pthread_create 失败,则 pthread_t 将成为垃圾,从而导致 pthread_join 崩溃

编辑:

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

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

关于C 管道分段故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7904220/

相关文章:

python - 需要一个工具来检测 C 代码中变量的类型

python - C++ python API : second call of PyImport_Import results in SIGSEGV

powershell - 使用Powershell将文件重新格式化为管道格式

windows - 如何将标准输出实时传输到批处理脚本

c - 当您从 execvp 接收输出时,从管道中读取适量的数据

c - 为什么我要覆盖我的结构?实现队列,但是行不通

c - 如何防止内部结构对 API 用户可见?

c - 未初始化的指针导致核心转储

C : mmap initialize at 0xffffffff

C 编程 : seg faults, printf 和相关问题