Разработка приложений в среде Linux. Второе издание
Шрифт:
155: case ';': /* множественные команды */
156: done=1;
157: return Command = *commandPtr + (src - *commandPtr) + 1;
158: break;
159:
160: case '\\' :
161: src++;
162: if (!*src) {
163: freeJob(job);
164: fprintf(stderr, "ожидается символ после \\\n");
165: return 1;
166: }
167: /*
двигаться дальше */
168: default:
169: *buf++=*src;
170: }
171:
172: src++;
173: }
174:
175: if (*prog->argv[argc]) {
176: argc++;
177: }
178: if (!argc) {
179: freeJob(job);
180: return 0;
181: }
182: prog->argv[argc]=NULL;
183:
184: if (!returnCommand) {
185: job->text = malloc(strlen(*commandPtr) + 1);
186: strcpy(job->text,*commandPtr);
187: } else {
188: /* Это оставляет хвостовые пробелы, что несколько излишне */
189:
190: count = returnCommand - *commandPtr;
191: job->text = malloc(count + 1);
192: strncpy(job->text,*commandPtr,count);
193: job->text[count] = '\0';
194: }
195:
196: *commandPtr = returnCommand;
197:
198: return 0;
199: }
200:
201: int runCommand(struct jobnewJob, struct jobSet *jobList,
202: intinBg) {
203: struct job *job;
204:
205: /* обходной путь "вручную" - мы не используем fork,
206: поэтому не можем легко реализовать фоновый режим */
207: if (!strcmp(newJob.progs[0].argv[0], "exit")) {
208: /* это должно вернуть реальный код возврата */
209: exit(0);
210: } else if(!strcmp(newJob.progs[0].argv[0], "jobs")) {
211: for (job = jobList->head; job; job = job->next)
212: printf(JOB_STATUS_FORMAT, job->jobId, "Работаю",
213: job->text);
214: return 0;
215: }
216:
217: /*
у нас пока только одна программа на дочернее задание,
218: потому это просто */
219: if (!(newJob.progs[0].pid = fork)) {
220: execvp(newJob.progs[0].argv[0],newJob.progs[0].argv);
221: fprintf(stderr, "exec для %s потерпела неудачу: %s\n",
222: newJob.progs[0].argv[0],
223: strerror(errno));
224: exit(1);
225: }
226:
227: /* поместить дочернюю программу в отдельную группу процессов */
228: setpgid(newJob.progs[0].pid,newJob.progs[0].pid);
229:
230: newJob.pgrp = newJob.progs[0].pid;
231:
232: /* найти идентификатор для задания */
233: newJob.jobld = 1;
234: for (job = jobList->head; job; job = job->next)
235: if (job->jobId >= newJob.jobId)
236: newJob.jobId = job->jobId+1;
237:
238: /* задание для списка заданий */
239: if (!jobList->head) {
240: job = jobList->head = malloc(sizeof(*job));
241: } else {
242: for (job = jobList->head; job->next; job = job->next);
243: job->next = malloc(sizeof(*job));
244: job = job->next;
245: }
246:
247: *job = newJob;
248: job->next = NULL;
249: job->runningProgs = job->numProgs;
250:
251: if (inBg) {
252: /* мы не ждем завершения фоновых заданий - добавить
253: в список фоновых заданий и оставить в покое */
254:
255: printf("[%d]%d\n", job->jobId,
256: newJob.progs[newJob.numProgs-1].pid);
257: } else {
258: jobList->fg=job;
259:
260: /* переместить новую группу процессов на передний план */
261:
262: if (tcsetpgrp(0,newJob.pgrp))
263: perror("tcsetpgrp");
264: }
Поделиться:
Популярные книги
Сын Тишайшего
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
"Искажающие реальность" Компиляция. Книги 1-14
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Школа. Первый пояс
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Невеста на откуп
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Убивать чтобы жить 2
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Вперед в прошлое!
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Аргумент барона Бронина 4
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Бастард Императора. Том 7
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Жаба с кошельком
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Бастард Императора. Том 11
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Академия чаросвет. Тень
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Наследие Маозари 4
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00