gpt4 book ai didi

c - 如何区分一个子进程与其他子进程

转载 作者:行者123 更新时间:2023-11-30 17:03:43 26 4
gpt4 key购买 nike

我有一项类作业,我对这部分要求感到困惑。因此,我们需要制作一个具有 n 个进程的多进程字计数器,并且 n 将作为程序的输入参数。每个进程都需要对输入文件的选定部分进行自己的小型字数统计。因此本质上输入的文件将被分为 1/n 部分并在 n 个进程之间分配。

我了解如何通过 for 循环 fork 进程以及如何使用管道将小字数从子进程发送到父进程,但我不确定如何告诉某个进程执行所选部分输入文件。

您会使用他们的 PID 值来检查他们所在的进程,然后为他们分配任务吗?

这是我到目前为止的代码。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MSGLEN 64
#define MESSES 3

int main(){
int fd[2];
pid_t pid;
int result;

//Creating a pipe
result = pipe (fd);
if (result < 0) {
//failure in creating a pipe
perror("pipe error\n");
exit (1);
}

//Creating a child process
for(int i = 0; i < MESSES; i++){
if ((pid = fork()) < 0) {
//failure in creating a child
perror ("fork error\n");
exit(2);
}
if(pid == 0)
break;
}

if (pid == 0) {
// ACTUALLY CHILD PROCESS
char message[MSGLEN];

//Clearing the message
memset (message, 0, sizeof(message));
printf ("Enter a message: ");
//scanf ("%s",message);

fgets (message, 1024, stdin);
close(fd[0]);

//Writing message to the pipe
write(fd[1], message, strlen(message));

close(fd[1]);
close(fd[0]);
exit (0);
}
else {
//Parent Process

char message[MSGLEN];
char *ptr;
long wc;
close(fd[1]);

while (1) {
//Clearing the message buffer
memset (message, 0, sizeof(message));

//Reading message from the pipe

if(read(fd[0], message, sizeof(message)) == 0)
exit(0);
printf("Message entered %s\n",message);
/*
Message entered needs to be in the format of number first space then string for it to work
*/

wc = 0;

wc = strtol(message, &ptr, 10);
printf("The number(unsigned long integer) is %ld\n", wc);
printf("String part is %s", ptr);



}
close(fd[0]);
wait(NULL);
// exit(0);
}
return 0;
}

最佳答案

使用 fork 时要记住的关键一点是父级和子级共享相同的内存,并且父级拥有的所有内容的副本都会传递给子级。此时, child 已经 fork 了 parent 的数据

在下面的代码中,我们计算了我们创建的进程数量。如果您想将其用作子项中的参数,则可以,即 nth 子项获取值 n

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define PROCESS_COUNT 50

int main(void) {
pid_t pid;
size_t pid_count = 0;
//pid_t pid_array[PROCESS_COUNT];
for(int i = 0; i < PROCESS_COUNT; i++) {
if ((pid = fork()) < 0) {
perror ("fork error\n");
exit(2);
}
if (pid == 0) {//child
size_t n = 0;
size_t p = getpid();
while(n++ < 2) {
//Next line is illustration purposes only ie I'm taking liberties by
//printing a pid_t value
printf("child %zu has pid_count == %zu\n", p, pid_count);
sleep(1);
}
exit (0);
}
else {
//Count how many process we've created.
pid_count++;
int status;
waitpid( -1, &status, WNOHANG);
}
}
wait(NULL);
return 0;
}

如果你想变得更有趣,你可以使用管道或共享内存来使用 IPC。有很多方法可以将数据从一个进程获取到另一个进程,有时像临时文件这样简单的方法就足够了。对于你的问题,我会使用 mmap 但它不需要那么复杂

关于c - 如何区分一个子进程与其他子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36049864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com