【发布时间】:2017-04-06 18:28:15
【问题描述】:
我正在尝试制作一个最多可创建 4 个子进程的程序。每个孩子将使用搜索功能在所需文件中查找某个单词:
bool 搜索(char *file,char *word,int 部分)
PS:你可以忽略搜索功能,它究竟做什么,因为这里的主要任务是在某个子进程成功时向多个子进程发送信号。
每个子进程都会在文件的某个部分进行搜索。即一个名为“foo”的文件,其中包含:
汽车
酒吧
焦油
远
子进程正在寻找字符串“bar”。
如果子进程成功找到字符串,它将以值 0 退出(exit(0)),否则如果它完成了整个部分但没有成功找到字符串,它将退出值为 1(exit(1))。
一旦存在值为 0 的孩子(成功找到字符串)。父进程会向其他子进程发送终止信号。
考虑以下代码:
#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。之后我向除该特定进程之外的其他进程发送了终止信号。
我写的代码正确吗?如果是这样,如何在不使用数组的情况下使用退出值发送信号?
【问题讨论】:
-
storage是一个具有自动存储期限的对象。它肯定不会在进程之间共享,因此您的方法绝对行不通。 -
@EOF 我想我明白了,4个子进程将有自己的变量存储的内存字段,对吧?这就是为什么它不起作用,因为父级在变量中没有值?如果我将它用作指针怎么办?这样能解决吗?
-
只有指向进程间共享内存的指针才能解决这个问题。在这种情况下,您还必须确保访问共享内存的原子性和顺序。
-
除了已经说明的问题之外,无论如何,即使可能,这种方法也只有在所有进程完成运行后才可行,因为在它们全部完成执行之前,您不会知道仍在执行的其中一个是否将以状态码 1 退出,但还没有这样做。由于您必须等待它们全部执行完毕,因此您根本不需要向它们发送任何信号。
-
@PaulGriffiths 我不是在等待它们全部完成,只有一个必须以状态码 0 完成,然后父进程将向尚未完成的其他进程发送终止信号(有些人可能会以状态码 1 结束,然后以状态码 0 结束,这是不成功的)。