实在是不知道怎么写回调函数的形参,报错是看懂了,解决方案想不出来
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
void process_a()
{
printf("process A is create.The Child process < %d > running...\n", getpid());
sleep(2);
exit(EXIT_SUCCESS);
}
void process_b()
{
printf("process B is create.The Child process < %d > running...\n", getpid());
sleep(5);
exit(EXIT_SUCCESS);
}
void create_process(void (*cp_funcp)(), void (*pp_funcp)())
{
if(NULL == cp_funcp)
return ;
pid_t cpid = 0;
cpid=fork();
if(cpid == -1)
{
perror("[Error]: process create faile ");
exit(EXIT_FAILURE);
}
else if(cpid == 0)// 子进程执行任务
{
cp_funcp();
}
else if(cpid > 0)// 父进程执行任务
{
pid_t rpid = 0;
int status = 0;
if(NULL != pp_funcp)
pp_funcp();
rpid = wait(&status);
printf("The Child Process < %d > has exited,exit code < %d >.\n",rpid,WEXITSTATUS(status));
}
return ;
}
int main(int argc, const char *argv[])
{
create_process(process_a, create_process(process_b, NULL));
return 0;
}提示错误:
main.c:57:28: error: invalid use of void expression create_process(process_a, create_process(process_b, NULL));
只创建一个进程是可以的,只需要写create_process(process_b, NULL);即可
但是创建2个进程不行
37
收起
正在回答 回答被采纳积分+1
4回答
慕小白0101
2023-05-13 21:25:24
else if(cpid > 0)// 父进程执行任务
{
pid_t rpid = 0;
int status = 0;
index+=1;
if(NULL != processlist[index])
{
create_process(processlist, index);
}
printf("wait a moment...\n");
// 非阻塞继续执行父进程代码
if((rpid = waitpid(-1,&status,WNOHANG)) == 0)
{
printf("waiting...\n");// 若子进程结束调用,该行代码不执行
}
// 阻塞等待子进程, 父进程休眠
// 由父进程等待进程进程销毁回收资源
rpid = wait(&status);
printf("The Child Process < %d > has exited,exit code < %d >.\n",rpid,WEXITSTATUS(status));
}无名老师,请问为什么这样写会导致“wait a moment..”.和"waiting..."每次都在上一个进程退出时才打印出来
顺序不对,a进程退出才打印“wait a moment..”.和"waiting..."

慕小白0101
2023-05-13 17:52:54
好像完成了这个功能,请老师看看这个代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
void process_a()
{
printf("process A is create.The Child process < %d > running...\n", getpid());
sleep(2);
exit(EXIT_SUCCESS);
}
void process_b()
{
printf("process B is create.The Child process < %d > running...\n", getpid());
sleep(5);
exit(EXIT_SUCCESS);
}
void process_c()
{
printf("process C is create.The Child process < %d > running...\n", getpid());
sleep(5);
exit(EXIT_SUCCESS);
}
void create_process(void (*processlist[4])(), int index)
{
if(NULL == processlist[index])
{
printf("processlist[%d] is NULL.\n", index);
return ;
}
pid_t cpid = 0;
cpid=fork();
if(cpid == -1)
{
perror("[Error]: process create faile ");
exit(EXIT_FAILURE);
}
else if(cpid == 0)// 子进程执行任务
{
processlist[index]();
}
else if(cpid > 0)// 父进程执行任务
{
pid_t rpid = 0;
int status = 0;
if(NULL != processlist[index])
{
index+=1;
create_process(processlist, index);
}
rpid = wait(&status);
printf("The Child Process < %d > has exited,exit code < %d >.\n",rpid,WEXITSTATUS(status));
}
return ;
}
int main(int argc, const char *argv[])
{
void (*processlist[4])(void)={process_a, process_b, process_c, NULL};
create_process(processlist, 0);
return 0;
}
慕小白0101
2023-05-13 16:31:04
改了一下,现在能创建两个进程了。那假如我要创建3个,4个,或者n个进程呢?
void create_process(void (*cp_funcp)(), void (*pp_funcp)())
{
if(NULL == cp_funcp)
return ;
pid_t cpid = 0;
cpid=fork();
if(cpid == -1)
{
perror("[Error]: process create faile ");
exit(EXIT_FAILURE);
}
else if(cpid == 0)// 子进程执行任务
{
cp_funcp();
}
else if(cpid > 0)// 父进程执行任务
{
pid_t rpid = 0;
int status = 0;
if(NULL != pp_funcp)
create_process(pp_funcp, NULL);
rpid = wait(&status);
printf("The Child Process < %d > has exited,exit code < %d >.\n",rpid,WEXITSTATUS(status));
}
return ;
}
int main(int argc, const char *argv[])
{
create_process(process_a, process_b);
return 0;
}
物联网/嵌入式工程师
- 参与学习 394 人
- 提交作业 23775 份
- 解答问题 1206 个
行业热门,政策风口,人才缺口极大,现在入场时机正好! 上千人检验,数轮迭代的硬核知识体系,软硬件通吃 保姆式教学+简历指导+1V1模拟面试+3次内推,助力轻松就业!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星