gpt4 book ai didi

在迷你 shell 中挂起 2 管道函数时,无法将信息存储在全局变量中

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

我正在编写一个迷你 shell,并且在作业控制中遇到问题。
我无法检索主函数中的数据,甚至无法检索 run_command 底部的数据。
我想知道如何存储并成功检索 main 中的信息。

typedef struct job{
int num;
pid_t pid[SIZE];
char* name[SIZE];
int occupied;
}
job jobs; <- the global variable

int run_command(........){
. .......
. .......
. result = fork(); // generate child process
. if ( result == 0 ){ //child process
. . if ( 2-pipe function is detected){ // 2 pipe
. . . .......
. . . .......
. . . pid01 = fork(); // fork the first child ( for the first "cat" in case of "cat | cat | cat")
. . . if (pid 01 == 0){
. . . .....
. . . }
. . . else{
. . . . pid02 = fork(); // fork the second child
. . . . if (pid02 == 0){
. . . . .....
. . . . }
. . . . else{
. . . . . pid03 = fork(); // fork the third child
. . . . . if (pid03 == 0){
. . . . . ....
. . . . . }
. . . . . else{
. . . . . . ....
. . . . . . waitpid(pid01,&status1, WUNTRACED);
. . . . . . waitpid(pid02,&status2, WUNTRACED);
. . . . . . waitpid(pid03,&status3, WUNTRACED);
. . . . . . if (WIFSTOPPED(status1)){
. . . . . . jobs.occupied = 1;
. . . . . . jobs.num = 3;
. . . . . . for () {} (a for loop to store the job, i.e. " cat | cat | cat ")
. . . . . . jobs.pid[0] = pid01;
. . . . . . }
. . . . . . if (WIFSTOPPED(status2)){
. . . . . . jobs.pid[1] = pid02;
. . . . . . }
. . . . . . if (WIFSTOPPED(status3)){
. . . . . . jobs.pid[2] = pid03;
. . . . . . }
. . . . . }
. . . . }
. . . }
. . }
. . exit(-1);
. }
. waitpid( result, &status, WUNTRACED);
. if (WIDSTOPPED(status)){
. ....
. }
. ( cannot retrieve jobs here already, like the variable "jobs" has been initialized again)
. return 0;
}

int main(){
.....
.....
.....
run_command(........);
(jobs hasn't been modified after I have press ctrl-z)
return 0;
}

最佳答案

通过 fork 创建的父进程和子进程之间不共享变量。进程之间通信的唯一方法包括:

  • 使用 Unix 域套接字交换数据
  • 在fork之前创建一个管道并用它来写入/读取数据
  • 使用进程的退出状态(有限的数据大小)
  • 信号的使用(数据大小非常有限,实际上只有 SIGUSR1 和 SIGUSR2 可以安全使用)

关于在迷你 shell 中挂起 2 管道函数时,无法将信息存储在全局变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19359719/

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