来自多线程cp程序的段错误

时间:2014-03-03 15:12:34

标签: c multithreading unix

我正在编写一个程序,它本质上是UNIX中“cp”命令的多线程版本。为此,我创建了输入/输出文件,并初始化了信号量(分配所需)以同步共享数据。这是我的主要代码:

int main(int argc, const char * argv[])
{
    //input/output file descriptors
    int fdIn, fdOut;

    //open files with proper rights
    fdIn = open(argv[1], O_RDONLY);
    fdOut = open(argv[2], O_WRONLY| O_CREAT | O_TRUNC, 0666);

    //create and initialize semaphores
    semaphore_t *empty = nullptr,*full = nullptr;
    semaphore_create(mach_task_self(), empty, SYNC_POLICY_FIFO, 2);
    semaphore_create(mach_task_self(), full, SYNC_POLICY_FIFO, 0);

    //create and initialize structs to pass args to threads
    threadDataConsumer.fd = fdOut;
    threadDataConsumer.empty = empty;
    threadDataConsumer.full = full;
    threadDataProducer.fd = fdIn;
    threadDataProducer.empty = empty;
    threadDataProducer.full = full;
    pthread_t tid1, tid2;

    //create a thread for the producer and consumer
    pthread_create(&tid1, NULL, Producer, (void *)&threadDataProducer);
    pthread_create(&tid2, NULL, Consumer, (void *)&threadDataConsumer);

    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    return 0;
}

我相信这是我的问题所在,因为我甚至没有开始编写Producer和消费者线程。任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:1)

semaphore_t *的{​​{1}}参数用于返回值。也就是说,函数需要知道构建信号量对象的位置。您不能只传入正确类型的任何变量:阅读文档以了解它的用途。在你的情况下:

semaphore_create()

一般情况下,学习如何使用调试器,它将准确告诉您段错误发生在哪一行。

同时验证您的输入并检查您的返回值。还有其他地方可能会出现这种情况。