如果执行任务失败,如何向多个子进程发送kill信号?

时间:2016-11-22 22:21:54

标签: c signals fork

我试图创建一个最多可创建4个子进程的程序。每个孩子都将使用搜索功能在所需文件中查找某个单词:

  

bool search(char * file,char * word,int section)

PS:你可以忽略搜索功能以及完全做什么,因为这里的主要任务是在某个子进程成功时向多个子进程发送信号。

每个子进程都将搜索文件的某个部分。即一个名为" foo"含有:

  

     

     

焦油

     

子进程正在寻找字符串" bar"。

如果子进程成功找到字符串,它将以值0( exit(0) )退出,否则如果它完成整个部分没有成功找到它将以值1退出的字符串( 退出(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.之后,我向其他进程发送了一个kill信号,除了该特定进程。

我写的代码是否正确?如果是这样如何使用退出值发送信号而不使用数组?

2 个答案:

答案 0 :(得分:0)

如果您不想使用数组,可以使用cmd()运行unix命令获取子进程ID列表。

fork()也将子进程ID返回给父进程。父级可以将其存储在数组中。

答案 1 :(得分:0)

您可以尝试将子代的pid存储在共享内存中的数组中,为此,您可能应该使用以下内容创建单独的.h文件。

struct shared_arr {
    int is_full;
    int pids_arr[4];
};

您可以使用以下代码段访问该共享结构:

int shm_id = shmget((key_t) 12345, sizeof(struct shared_arr), 0666| IPC_CREAT);

//get the shared data
struct shared_arr *shared_data;
void* shared_memory = (void*) 0;
shared_memory = shmat(shm_id, (void*)0,0);
if(shared_memory == (void *) -1) {
    fprintf(stderr, "shmat FAILED\n");
}
shared_data = (struct shared_arr *) shared_memory;

//init shared data with zeros
for(int i = 0; i < MAX_SHARED_ARR_SIZE; i++) {
    shared_data->pids_arr[i] = 0;
}

详细信息:https://en.wikipedia.org/wiki/Shared_memory#Support_on_Unix-like_systems

另外,考虑设置进程组ID并使用一次kill调用向同一进程组中的所有进程发送信号。

有关设置组ID的详细信息:https://www.systutorials.com/docs/linux/man/2-setpgid/ 关于杀人:http://man7.org/linux/man-pages/man2/kill.2.html