我有这样的代码是应该创建三个子进程,并且每个将执行一个小的数学运算。 然后,家长应该利用所有的子进程的结果,并得到一个最终的答案,但我不能找到一种方法,实际读取从父孩子的结果。 有没有办法做到这一点?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
int pid1, pid2, pid3, status;
int a=1, b=2, c=5, d=4, e=6, f=3, g;
int t1, t2, t3;
printf("Hello World!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
printf("Here I am before use of forking\n");
printf("I am the PARENT process and pid is : %d\n",getpid());
pid1 = fork( );
if (pid1 == 0)
{
printf("\n\nHere I am just after child forking1\n");
printf("I am the Child process and pid1 is :%d\n",getpid());
printf("My parent's pid is :%d\n",getppid());
t1 = a+b;
printf("The answer for t1 is: %d\n", t1);
exit(0);
}
else
{
wait(&status);
printf("\nHere I am just after parent forking1\n");
printf("I am the Parent process and pid is: %d\n",getpid());
}
pid2 = fork( );
if (pid2 == 0)
{
printf("\n\nHere I am just after child forking2\n");
printf("I am the Child process and pid2 is :%d\n",getpid());
printf("My parent's pid is :%d\n",getppid());
t2 = c+d;
printf("The answer for t2 is: %d\n", t2);
exit(0);
}
else
{
wait(&status);
printf("\nHere I am just after parent forking2\n");
printf("I am the Parent process and pid is: %d\n",getpid());
}
pid3 = fork( );
if (pid3 == 0)
{
printf("\n\nHere I am just after child forking3\n");
printf("I am the Child process and pid3 is :%d\n",getpid());
printf("My parent's pid is :%d\n",getppid());
t3 = e/f;
printf("The answer for t3 is: %d\n", t3);
exit(0);
}
else
{
wait(&status);
printf("\nHere I am just after parent forkingALL\n");
printf("I am the Parent process and pid is: %d\n",getpid());
}
printf("\n\nThe final answer for t1 is: %d\n", t1);
printf("The final answer for t2 is: %d\n", t2);
printf("The final answer for t3 is: %d\n", t3);
g = t1*t2-t3;
printf("The final answer for g is: %d\n", g);
}
你可以用一个非常简单的技术,它是共享内存做到这一点。 我会给它是如何工作的完整示例。
首先,让我们假设我要编写一个程序来打印第一n
在斐波那契数列项 (我知道这是不是合乎逻辑的这样做,但它是一个简单的例子让每个人都能理解它)。
- 我有一个父读取表示第一整数值
n
术语 - 然后,父进程会创建一个子,并通过
n
给它 - 那么孩子应该计算出前n项和返回他们回到父母。
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/stat.h>
void printFibo(int n, int *fibo)
{
int i;
for(i=0; i<=n; i++)
printf("%d -> %d\n" ,i, fibo[i]);
}
void computeFibo(int n, int *fibo)
{
int i;
fibo[0] = 0;
fibo[1] = 1;
for (i=2; i<=n; i++)
fibo[i] = fibo[i-1] + fibo[i-2];
}
int main(int argc, char *argv[])
{
pid_t childPID;
int status;
int shm_fd;
int* shared_memory;
int msize; // the size (in bytes) of the shared memory segment
const char *name = "FIBONACCI_SERIES";
int n;
if (argc!=2)
{
fprintf(stderr, "usage: %s <Fibonacci number to be generated>\n", argv[0]);
return -1;
}
n = atoi(argv[1]);
if (n < 0)
{
fprintf(stderr, "Illegal fibonacci number: %s\n", argv[1]);
return -2;
}
// calculating the array size based on the number of terms being passed from child to parent
msize = (n+2)*sizeof(int);
// open the memory
shm_fd = shm_open (name, O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRWXG);
if (shm_fd < 0)
{
fprintf(stderr,"Error in shm_open()");
return -3;
}
printf("Created shared memory object %s\n", name);
// attach the shared memory segment
ftruncate(shm_fd, msize);
printf("shmat returned\n");
// allocating the shared memory
shared_memory = (int *) mmap(NULL, msize, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (shared_memory == NULL)
{
fprintf(stderr,"Error in mmap()");
return -3;
}
printf("Shared memory segment allocated correctly (%d bytes).\n", msize);
shared_memory[0] = n;
childPID=fork();
if ( childPID == -1 )
{
fprintf(stderr, "Cannot proceed. fork() error");
return -4;
}
if (childPID == 0)
{
// then we're the child process
computeFibo(shared_memory[0],shared_memory+1);
exit(0);
}
else
{
// parent will wait until the child finished
wait(&status);
// print the final results in the
printFibo(shared_memory[0], shared_memory+1);
// now detach the shared memory segment
shm_unlink(name);
}
return 0;
}
如果你想这样做,而不使用通信即管道的任何方式,共享内存,那么你将不得不使用exit()
系统调用。 在exit
系统调用返回,然后由捕获信号wait()
在父进程的系统调用。 在这里,我给你在我从孩子发送值父代码。 你有最后一件事由255除以等待抓住了信号得到确切的价值。 `
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
int main(int argc,char *argv[])
{
pid_t pid=fork();
if(pid==0)
{//child
int sum=5+7;
exit(sum);//sending exiting status or any value to parent
}
else
{//parent
int childval=-1;
wait(&childval);//catching signal sent by exit of(child)
printf("%d",childval/255);//changing signal to exact value
}
return 0;
}
`
fork
使得该过程的副本,所以一旦你叫fork
子进程有自己的,你希望从父读取变量T1,T2和T3的副本。
所以,一旦你exit
孩子,孩子死了一起与计算值这是当地给他们。
如果你想读的儿童的价值观,你必须使用pipes
或共享内存。
你必须在父进程创建管道,比叉后,必须关闭输入文件描述符的子过程,并关闭输出文件描述符的父进程。
还有例如从管道(2)手册页。
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int
main(int argc, char *argv[])
{
int pipefd[2];
pid_t cpid;
char buf;
if (argc != 2) {
fprintf(stderr, "Usage: %s <string>\n", argv[0]);
exit(EXIT_FAILURE);
}
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { /* Child reads from pipe */
close(pipefd[1]); /* Close unused write end */
while (read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "\n", 1);
close(pipefd[0]);
_exit(EXIT_SUCCESS);
} else { /* Parent writes argv[1] to pipe */
close(pipefd[0]); /* Close unused read end */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
}
}