2016-11-22 54 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返回给父进程。父母可以将其存储在数组中。

相关问题