我试图创建一个最多可创建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信号,除了该特定进程。
我写的代码是否正确?如果是这样如何使用退出值发送信号而不使用数组?
答案 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