0

我想编写一个执行此命令的程序:

gcc -c file1 file2 file3 ...

程序必须创建子进程,每个子进程将编译一个文件。我在子进程中使用了这个命令:

execlp("gcc","gcc","-c","-Wall",argv[i],NULL);

到目前为止,一切都很好。问题是如果编译文件时出现错误,父进程必须打印出错误的文件名。这是打印文件名的父级的条件。

我的解决方案是创建一个包含子 pid 和它编译的文件名的表。父母将等待其孩子结束。在孩子结束时,我们查看孩子是否正常终止(它返回 0)。如果不是,我们在表中搜索以找到它使用他的 pid 处理的文件名。

我正在寻找另一种解决方案。我不知道是否有办法将文件名发送到父进程。当然,只有在该文件中有错误时我们才会这样做。

谢谢。

4

1 回答 1

0

听起来您需要创建一个任务队列。即创建工作线程来完成一些任务,然后离开。如果是这种情况,则在此处描述该方法。

但你真正的问题是关于在线程之间来回传递数据。函数CreateThread包含一个参数 ,LPVOID lpParameter它就是为了实现这种能力而包含的。它是一个 void *,因此它将接受任何变量类型,包括指向数组的指针、指向结构的指针等。这允许您根据需要来回传递尽可能多或尽可能少的数据。

下面的代码片段传递一个指向数据数组的指针。这将是你感兴趣的部分

这是创建线程的部分

    hThreadArray[i] = CreateThread( 
        NULL,                   // default security attributes
        0,                      // use default stack size  
        MyThreadFunction,       // thread function name
        pDataArray[i],          // argument to thread function 
        0,                      // use default creation flags 
        &dwThreadIdArray[i]);   // returns the thread identifier 

寻找MyThreadFunction将接收和传递数据的工作函数:

这是完整的可构建代码

对于 posix

pthread_create()还包含可传递的数据:
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg); invoid *arg
参数可以使用最后一个参数传递给线程,就像在 windows 版本中一样。你想要做的还有一个函数pthread_join(),原型化:
int pthread_join(pthread_t th, void **thread_return);
这个函数在被调用的线程结束时用作处理程序(第一个参数线程句柄)。当线程退出时,pthread_join 中的最后一个参数可以接收数据。这些数据可能对您声明的目的有用。

于 2013-10-26T18:22:08.493 回答