2016-11-22 55 views
0

我正在試圖創建一個程序,最多可創建4個子進程。每個孩子都會使用搜索功能所需的文件中查找某個詞:如何在發生執行任務失敗的情況下向多個子進程發送kill信號?

布爾搜索(字符*文件,字符* WORD,INT部分)

PS:可以忽略搜索功能,它是什麼確切地說是作爲這裏的主要任務是在某個子進程成功後向多個子進程發送一個信號。

每個子進程都會在文件的某個部分進行搜索。即一個名爲 「foo」 是containts文件:

酒吧

焦油

過程正在尋找字符串 「bar」 的孩子。

如果一個子進程中找到字符串成功,它將具有0值(出口(0)),否則,如果它完成了整節沒有sucess發現它會與價值退出的字符串退出1(exit(1))。

一旦孩子存在值0(找到字符串成功)。父母會向其他子進程發送一個kill信號。

考慮下面的代碼:

#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 


int main() 
{ 
    pid_t p; 
    p=fork(); 
    int i; 
    int storage[4]; 
    for(i=0;i<4;i++) 
    { 
     p=fork(); 
     if(p==0) 
     { 
      storage[i]=getpid(); 
      open("testfile.txt",O_WRONLY); 
      if(search("testfile.txt","bar",i)) 
      { 
       storage[i]=1; 
       //exit(0); 
      } 
      else 
       //exit(1); 
     } 
    } 

    for(i=0;i<4;i++) 
    { 
     if(storage[i]!=1) 
      kill(stroage[i],SIGTERM); 
    } 
} 

我在此代碼確實是使用的4個整數數組,它包含的子進程的ID。成功的孩子的案例變爲1.之後,除了該特定過程之外,我向其他進程發送了終止信號。

我寫的代碼是否正確?如果是這樣的話,我如何使用退出值發送信號而不使用陣列?

+0

'storage'是一個自動存儲持續時間的對象。這些過程當然不是共享的,所以你的方法絕對不行。 – EOF

+0

@EOF我想我明白了,這4個子進程會有自己的變量存儲區的內存字段,對吧?這就是爲什麼它不起作用,因爲父母在變量中沒有值?如果我將它用作指針會怎麼樣?這會解決嗎? – Amine

+0

如果指針指向進程之間共享的內存,指針只會解決此問題。在這種情況下,您還必須確保訪問共享內存的原子性和順序。 – EOF

回答

0

如果您不想使用數組,可以運行unix命令以使用cmd()獲取子進程ID列表。

另外fork()將子進程ID返回給父進程。父母可以將其存儲在數組中。

相關問題