2013-10-26 32 views
0

獲取信息,我想編寫一個程序,做這個命令:如何從子進程

gcc -c file1 file2 file3 ... 

程序必須創建子進程和每個孩子將編譯一個文件。我在子進程中使用這個命令:

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

到目前爲止好。問題是如果編譯文件時出現錯誤,則父進程必須在出現錯誤時打印文件的名稱。這是父母將打印文件名的一個條件。

我的解決方案是創建一個包含子pid和它編譯的文件名的表。父母將等待其孩子結束。在孩子的盡頭,我們看看孩子是否正常結束(它返回0)。如果不是,我們在表中搜索找到它使用他的pid處理的文件名。

我正在尋找另一種解決方案。我不知道是否有辦法將文件名發送到父進程。當然,只有在該文件中存在錯誤時我們纔會這樣做。

謝謝。

回答

0

聽起來你需要創建一個任務隊列。即創建工作線程來完成某個任務,然後離開。如果是這種情況,則該方法是described here

但你真正的問題是關於在線程之間來回傳遞數據。功能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將接收和傳遞數據的部分:

這裏是complete, build-able code

對於posix

pthread_create()還包含可通過數據:
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg);void *arg
參數可以使用的最後一個參數,就像在Windows版本將傳遞給線程。另外,在你想要做的是一個功能pthread_join(),原型玩法:
int pthread_join(pthread_t th, void **thread_return);
這個功能被用作處理器於所要求的(第一個參數線程處理)的線程結束。當線程退出時,pthread_join中的最後一個參數可以接收數據。這些數據可能對您所述的目的有用。

+0

對不起,我忘了說,我的程序是在C不是C++,我必須使用POSIX標準 –

+0

哦,這改變了事情,不是嗎? – ryyker

+0

@rabahRachid - 在POSIX上添加了一些註釋。 'pthread_join()'傳遞'void ** arg'。應該提供方法來做你需要的。 – ryyker

相關問題