Что касается фоновых процессов с использованием fork () и дочерних процессов в моей фиктивной оболочке

Я пытаюсь создать простую программу оболочки на C. Все, что мне нужно, это предоставить пользователю подсказку, в которой он может запустить другие локальные программы. Я могу отлично справиться с этой частью, используя fork (), в котором родительский процесс ждет () для дочернего процесса, а дочерний процесс execvp () является программой.

Однако, если в конце команды пользователя добавлен символ «&», мне нужно, чтобы их программа работала в фоновом режиме, то есть мне нужно, чтобы родитель НЕ ждал дочернего процесса, а вместо этого немедленно возвращал приглашение в пользователь, позволяя фоновому процессу продолжать работу, но не позволяя ему ничего отображать на экране. Я просто хочу убедиться, что он все еще существует, с помощью команды ps.

Я попытался понять идею использования fork () для создания дочернего процесса, затем снова использовать дочерний fork () для создания своего рода внука, а затем немедленно выйти из дочернего процесса (). то есть осиротел внук. Предположительно, это позволяет родителю все еще ждать дочернего элемента, но поскольку дочерний элемент фактически завершается почти сразу, это как будто он вообще не ждет? Что-нибудь о зомби-безумии? Я не знаю. Несколько сайтов, с которыми я столкнулся, похоже, рекомендуют это как способ запуска процесса в фоновом режиме.

Однако, когда я пытаюсь сделать это, я получаю дикие вещи, происходящие с потоком программы, «фоновый» процесс продолжает отображать ввод на экране, и я действительно не уверен, что делать дальше.

Это моя реализация кода, которая, я уверен, совершенно неверна. Мне просто интересно, является ли вся эта история с внуками тем маршрутом, который мне нужно выбрать, и если да, то что не так с моим кодом?

36 int main(int argc, char *argv[])
37 {
38     char buffer[512];
39     char *args[16];
40     int background;
41     int *status;
42     size_t arg_ct;
43     pid_t pid;
44 
45     while(1)
46     {
47         printf("> ");
48         fgets(buffer, 512, stdin);
49         parse_args(buffer, args, 16, &arg_ct);
50 
51         if (arg_ct == 0) continue;
52 
53         if (!strcmp(args[0], "exit"))
54         {
55             exit(0);
56         }
57 
58         pid = fork();  //here I fork and create a child process
61 
62         if (pid && !background)  //i.e. if it's the parent process and don't need to run in the background (this is the part that seems to work)
63         {
64             printf("Waiting on child (%d).\n", pid);
65             pid = wait(status);
66             printf("Child (%d) finished.\n", pid);
67         }
68         else
69         {
70             if (background && pid == 0) { //if it's a child process and i need to run the command in background
71                
72                 pid = fork(); //fork child and create a grandchild
73                 if (pid) exit(0); //exit child and orphan grandchild
74                 
75                 execvp(args[0], args); //orphan execs the command then exits
76                 exit(1);
77 
78             } else exit(0);
79         }
80     }
81     return 0;
82 }

P.S. Для ясности, мне нужен процесс, который я выполняю в фоновом режиме, чтобы никогда больше не издавать звук, даже если у него есть бесконечный цикл операторов печати или что-то в этом роде. Я просто хочу убедиться, что он все еще работает в фоновом режиме через ps -a или что-то в этом роде.

Простите за запутанное объяснение, я просто не знаю, как это объяснить лучше.

Заранее спасибо

PPS Я буду реализовывать его так, чтобы каждая последующая команда определяла логическое значение 'background', извините за путаницу

18
задан alhelal 21 August 2017 в 19:56
поделиться