linux 创建父进程和子进程并通信问题
1.Fibonacci序列是0,1,1,2,3,5,8,....,通常它可以表示为:fib0=0fib1=1fibn=fibn−1+fibn−2编...
1. Fibonacci序列是0, 1, 1, 2, 3, 5, 8, .... ,通常它可以表示为:
f ib0 = 0
f ib1 = 1
f ibn = f ibn−1 + f ibn−2
编写一个C程序,使用系统调用fork()创建两个子进程P1和P2。他们的任务如下:
1) 子进程P1打印自己的pid,然后使用exec(族)系统调用显示当前目录下文件和子目录的详细信息。
2) 子进程P2中生成Fibonacci序列,序列的个数在程序命令行中作为参数传入,例如,参数为7,则子进程P2生成的Fibonacci序列为0、1、2、3、5、8、13。通过某种进程通信机制(共享内存、管道、消息等IPC机制),子进程P2把生成的Fibonacci序列发送给父进程,并由父进程输出(打印)Fibonacci序列。在父子进程通信的过程中必须实现同步,以使在子进程完成生成序列之前,父进程不会输出Fibonacci序列。使用wait()系统调用可以实现各进程的同步。执行必要的错误检查以保证不会接受命令行参数传递来的负值。
要求用管道 和wait()编程实现 展开
f ib0 = 0
f ib1 = 1
f ibn = f ibn−1 + f ibn−2
编写一个C程序,使用系统调用fork()创建两个子进程P1和P2。他们的任务如下:
1) 子进程P1打印自己的pid,然后使用exec(族)系统调用显示当前目录下文件和子目录的详细信息。
2) 子进程P2中生成Fibonacci序列,序列的个数在程序命令行中作为参数传入,例如,参数为7,则子进程P2生成的Fibonacci序列为0、1、2、3、5、8、13。通过某种进程通信机制(共享内存、管道、消息等IPC机制),子进程P2把生成的Fibonacci序列发送给父进程,并由父进程输出(打印)Fibonacci序列。在父子进程通信的过程中必须实现同步,以使在子进程完成生成序列之前,父进程不会输出Fibonacci序列。使用wait()系统调用可以实现各进程的同步。执行必要的错误检查以保证不会接受命令行参数传递来的负值。
要求用管道 和wait()编程实现 展开
2个回答
展开全部
看我下面的程序,还有问题可以baidu hi我
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int pid, pfd[2], seq;
if (argc != 2)
{
printf("Usage:\t %s num\n", argv[0]);
return 1;
}
seq = atoi(argv[1]);
if (seq <= 0)
{
printf("Error: seq shall be larger than 0.\n");
return 1;
}
pid = fork();
if (pid == 0)
{
/* child 1 */
execlp("/bin/ls", "/bin/ls", "-R", ".", NULL);
}
else if (pid > 0)
{
wait(NULL);
printf("\n\nThis is parent process, child 1 finished.\n");
}
/* create pipe */
pipe(pfd);
pid = fork();
if (pid == 0)
{
/* child 2 */
int next = 1, i, fib = 0, tmp;
close(pfd[0]);
for (i = 0; i < seq; i++)
{
write(pfd[1], &fib, sizeof(fib));
tmp = fib;
fib = next;
next += tmp;
}
/* -1 indicates the end of fibonacci seq */
fib = -1;
write(pfd[1], &fib, sizeof(fib));
return 0;
}
else if (pid > 0)
{
/* parent */
int fib;
close(pfd[1]);
wait(NULL);
printf("In parent process, child 2 finished, time to print fibonacci sequence...\n");
while (read(pfd[0], &fib, sizeof(fib)) == sizeof(fib))
{
if (fib >= 0)
{
printf("%4d ", fib);
}
else
{
printf("\n");
break;
}
}
printf("\n All DONE!\n");
}
return 0;
}
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int pid, pfd[2], seq;
if (argc != 2)
{
printf("Usage:\t %s num\n", argv[0]);
return 1;
}
seq = atoi(argv[1]);
if (seq <= 0)
{
printf("Error: seq shall be larger than 0.\n");
return 1;
}
pid = fork();
if (pid == 0)
{
/* child 1 */
execlp("/bin/ls", "/bin/ls", "-R", ".", NULL);
}
else if (pid > 0)
{
wait(NULL);
printf("\n\nThis is parent process, child 1 finished.\n");
}
/* create pipe */
pipe(pfd);
pid = fork();
if (pid == 0)
{
/* child 2 */
int next = 1, i, fib = 0, tmp;
close(pfd[0]);
for (i = 0; i < seq; i++)
{
write(pfd[1], &fib, sizeof(fib));
tmp = fib;
fib = next;
next += tmp;
}
/* -1 indicates the end of fibonacci seq */
fib = -1;
write(pfd[1], &fib, sizeof(fib));
return 0;
}
else if (pid > 0)
{
/* parent */
int fib;
close(pfd[1]);
wait(NULL);
printf("In parent process, child 2 finished, time to print fibonacci sequence...\n");
while (read(pfd[0], &fib, sizeof(fib)) == sizeof(fib))
{
if (fib >= 0)
{
printf("%4d ", fib);
}
else
{
printf("\n");
break;
}
}
printf("\n All DONE!\n");
}
return 0;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
大雅新科技有限公司
2024-11-19 广告
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,...
点击进入详情页
本回答由大雅新科技有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |