Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

265:

266: return 0;

267: }

268:

269: void removeJob(struct jobSet *jobList, struct job *job) {

270: struct job *prevJob;

271:

272: freeJob(job);

273: if (job == jobList->head) {

274: jobList->head=job->next;

275: } else {

276: prevJob = jobList->head;

277: while (prevJob->next != job) prevJob = prevJob->next;

278: prevJob->next=job->next;

279: }

280:

281: free(job);

282: }

283:

284: /*
Проверить, завершился ли какой-то из фоновых процессов -

285: если да, выяснить, почему и определить, завершилось ли задание */

286: void checkJobs(struct jobSet *jobList) {

287: struct job *job;

288: pid_t childpid;

289: int status;

290: int progNum;

291:

292: while ((childpid = waitpid(-1, &status, WNOHANG))>0) {

293: for (job = jobList->head;job;job = job->next) {

294: progNum = 0;

295: while (progNum<job->numProgs &&

296: job->progs[progNum].pid != childpid)

297: progNum++;

298: if (progNum<job->numProgs) break;

299: }

300:

301: job->runningProgs--;

302: job->progs[progNum].pid = 0;

303:

304: if (!job->runningProgs) {

305: printf(JOB_STATUS_FORMAT,job->jobId,"Готово",

306: job->text);

307: removeJob(jobList, job);

308: }

309: }

310:

311: if (childpid == -1 && errno!= ECHILD)

312: perror("waitpid");

313: }

314:

315: int main(int argc, const char **argv) {

316: char command [MAX_COMMAND_LEN + 1];

317: char *nextCommand = NULL;

318: struct jobSetjobList = {NULL, NULL};

319: struct jobnewJob;

320: FILE *input = stdin;

321: int i;

322: int status;

323: int inBg;

324:

325: if (argc>2) {

326: fprintf(stderr,"Непредвиденные
аргументы; использование: ladsh1 "

327: "<команды>\n");

328: exit(1);

329: } else if (argc == 2) {

330: input = fopen(argv[1], "r");

331: if (!input) {

332: perror("fopen");

333: exit(1);

334: }

335: }

336:

337: /* не обращать внимания на этот сигнал; он только вводит

338: в заблуждение и не имеет особого значения для оболочки */

339: signal(SIGTTOU, SIG_IGN);

340:

341: while(1) {

342: if (!jobList.fg) {

343: /* нет заданий переднего плана */

344:

345: /* проверить, завершились ли какие-то фоновые процессы */

346: checkJobs(&jobList);

347:

348: if (!nextCommand) {

349: if (getCommand(input, command)) break;

350: nextCommand=command;

351: }

352:

353: if (!parseCommand(&nextCommand, &newJob, &inBg) &&

354: newJob.numProgs) {

355: runCommand(newJob,&jobList,inBg);

356: }

357: } else {

358: /* задание выполняется на переднем плане; ждать завершения */

359: i = 0;

360: while (!jobList.fg->progs[i].pid) i++;

361:

362: waitpid(jobList.fg->progs[i].pid,&status,0);

363:

364: jobList.fg->runningProgs--;

365: jobList.fg->progs[i].pid=0;

366:

367: if (!jobList.fg->runningProgs) {

368: /* дочернее завершилось */

369:

370: removeJob(&jobList, jobList.fg);

371: jobList.fg = NULL;

372:

373: /* переместить оболочку на передний план */

Поделиться:
Популярные книги

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Аргумент барона Бронина 4

Ковальчук Олег Валентинович
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 4

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4