Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 管道分段故障_C_Segmentation Fault_Pipe - Fatal编程技术网

C 管道分段故障

C 管道分段故障,c,segmentation-fault,pipe,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_con

我有以下代码

    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);
当我调用
pipe(fd)
时,当线程连接时,我得到一个分段错误EDIT
有人能告诉我为什么吗?

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

如果
pthread\u create
失败,那么pthread\u t将成为垃圾,它将崩溃
pthread\u join

编辑:

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


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

首先要检查的是
pthread\u create
调用的返回值,您正在存储它们,但从不检查线程是否实际启动

如果
pthread\u create
失败,那么pthread\u t将成为垃圾,它将崩溃
pthread\u join

编辑:

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


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

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

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

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

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

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

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

此代码没有问题。该错误可能出现在应用程序的其他位置。您是否尝试附加调试器以查看seg故障发生的原因?我刚刚将这两行添加到主函数的顶部,当我注释掉管道(fd)时,程序运行良好。我现在正在使用调试器进行检查,并尝试在管道后面放一个exit(0)语句,以查看它是否确实如此(P.s.您在哪个平台上?只是好奇)我在linux上运行,出口(0)显示出并不是管道出了故障。我将发布我的代码的其余部分此代码没有任何错误。该错误可能出现在应用程序的其他位置。您是否尝试附加调试器以查看seg故障发生的原因?我刚刚将这两行添加到主函数的顶部,当我注释掉管道(fd)时,程序运行良好。我现在正在使用调试器进行检查,并尝试在管道后面放一个exit(0)语句,以查看它是否确实如此(P.s.您在哪个平台上?只是好奇)我在linux上运行,出口(0)显示出并不是管道出了故障。我将发布我的代码的其余部分,这些是C99可变修改的声明。他们很好。一定要检查所有的错误返回码。让自己成为一个宏或函数来检查代码,打印错误并中止,然后用它包装调用。@Zack我被纠正了-我想我从来没有使用过C99,所以没有真正看过它。gcc允许您在堆栈上分配可变长度数组(显然在堆中不是静态的)除非您使用标准指定
-pedantic
,否则这些都是C99可变修改声明。他们很好。一定要检查所有的错误返回码。让自己成为一个宏或函数来检查代码,打印错误并中止,然后用它包装调用。@Zack我被纠正了-我想我从来没有使用过C99,所以没有真正看过它。gcc允许您在堆栈上分配可变长度数组(显然在堆中不是静态的)除非您使用标准指定
-pedantic