Размещение процесса в фоновом режиме в C

м в настоящее время погружается в создание фоновой работы вC с&, Мне нужно реализовать неблокирующуюwaitpid для того, чтобы это работало. Я знаю это. Кроме того, я уже ловлю состояние, если& вводится в конце командной строки. Я'Я просто не уверен, как точно отправить процесс с концом в фоновое задание, а также реализовать его как выполняющийся, пока другое приглашение запрашивает следующую команду.

Все поможет, спасибо.

    struct bgprocess{
        int pid;
        struct bgprocess * next;
        struct bgprocess * prev;    
    };

    struct bgprocess * bgprocess1;
    bgprocess1 = malloc(sizeof(struct bgprocess));
    bgprocess1->prev = NULL;
    bgprocess1->next = NULL;
    bgprocess1->pid = NULL;

    struct bgprocess * current;
    current = bgprocess1;

    do{
        int bgreturn = 0;
        while (current != NULL){
            if (waitpid(current->pid, &bgreturn, WNOHANG)){
                printf("Child exited");
                current->prev->next = current->next;
                current->next->prev = current->prev;
                current->prev = NULL;
                current->next = NULL;
                free(current);                  
            }
        current = current->next;    
        }
        if (end){
            int pid = fork();
            if (pid < 0){
                exit(1);            
            }       
            if (pid) {
                execvp(args[0], args);          
                exit(0);            
            }

            struct bgprocess * newNode;
            newNode = malloc(sizeof(struct bgprocess));
            newNode->pid = pid;
            newNode->next = NULL;

            if (current->next == NULL){
                current->next = newNode;        
            }
            while (1){
                if (current->next == NULL){
                    current->next = newNode;
                }           
                current = current->next;
            }

        }
    }
    while (current != NULL);

    int bgreturn = 0;
    while (current != NULL){
        if (waitpid(current->pid, &bgreturn,0)){
            printf("Child exited");
            current->prev->next = current->next;
            current->next->prev = current->prev;
            current->prev = NULL;
            current->next = NULL;
            free(current);  
        }
        current = current->next;
    }
    }

Хорошо, так что яЯ работал над этим еще немного, и я думаю, что начинаю понимать. У меня все еще есть несколько синтаксических ошибок, которые яя не знаю, как исправить, поэтому яВозможно, я буду использовать GDB или что-то еще, если кто-то еще не может указать им. Я поступаю правильно или я совершенно неправ?

 Requiem11 окт. 2012 г., 20:24
Да, я избавился от while (1) вскоре после публикации кода. Я понятия не имею, почему я это честно изложил. Так что мне нужно сделать временную переменную, чтобы правильно удалить узел?
 Requiem11 окт. 2012 г., 18:17
@FrankieTheKneeMan переделал код дальше. Избавился от всех моих синтаксических ошибок. Теперь просто получаю сегфоут вокруг моего удаляющего узла.
 MOHAMED10 окт. 2012 г., 19:22
Вы хотите выполнить внешнюю команду linux из своего кода C в фоновом режиме?
 Requiem10 окт. 2012 г., 19:23
ищу выполнение внешних команд в системе Solaris из моей собственной оболочки, написанной на C.
 FrankieTheKneeMan11 окт. 2012 г., 18:15
Опубликуйте свои ошибки.
 FrankieTheKneeMan11 окт. 2012 г., 18:49
В этом есть смысл. Вы'не имеет дело с краями должным образом. Например: если естьтолько один узел в списке,current->prev а такжеcurrent->next являются нулевыми А если их нет, что тогда? Кроме того, почему вы делаете некоторое время (1)? Этот цикл обязательно пройдет от конца массива.
 Requiem10 окт. 2012 г., 19:27
Нет я неЯ не пробовал ничего подобного. Мне нужно все реализовать самостоятельно.
 FrankieTheKneeMan10 окт. 2012 г., 19:59
Со страницы руководства (с которой я связал вас в моем ответе, но вы можете посмотреть свою систему, набравman wait): 'WNOHANG: немедленно вернитесь, если ни один ребенок не вышел - это означает, что это не такждать, он просто проверяет, чтопроисходит с этим ребенком. Сделайте себе одолжение и всегда читайте страницу MAN. Сверху вниз. Oни'довольно хорошо написано.
 b3h3m0th10 окт. 2012 г., 19:25
Может быть, вы заинтересованы вstackoverflow.com/questions/1618756/...
 MOHAMED10 окт. 2012 г., 19:26
ты пробовал что-то подобное?system("external command &");
 s4y10 окт. 2012 г., 19:24
 FrankieTheKneeMan10 окт. 2012 г., 20:59
@Requiem, пожалуйста, оставьте свой полный код, если вам нужна дополнительная помощь.
 FrankieTheKneeMan10 окт. 2012 г., 19:40
Вы'Я явно не все включил. Например, что это?endpathlist? Почему вы разветвляете десять дочерних процессов? Почему вы используете WNOHANG, когда кажется, что вы действительно хотите, чтобы ваш процесс завис и ожидал этих спящих процессов? Вы сказали нижес печатьюLS'? Куда? Здесь нет печатных заявлений.
 Requiem11 окт. 2012 г., 20:25
м, если предположить, что все остальное выглядит довольно солидно? Я думаю, я понял, в основном все, что этоЭто просто устранение этой проблемы, а также прохождение и размещение подсказки в нужном месте.
 Requiem11 окт. 2012 г., 17:41
@FrankieTheKneeMan снова опубликовал мой код, чтобы посмотреть,м на правильном пути или нет. Я'я получаю несколько странных синтаксических ошибок, которые ямы пытались выяснить, как это скомпилировать.
 Requiem10 окт. 2012 г., 19:46
извини, я пропустил кое-что. У меня также был execvp в моем первом цикле for для любой команды, которую я хочу выполнить. Мой список путей - это мой список каталогов, которые ям позволил искать внешние команды. Конец установлен на "&" если "&" это конец моей командной строки, которую я ввел. Я думал, что десять дочерних процессов сработают, если яЯ имею несколько фоновых процессов, происходящих одновременно. И я нея не знаю об использовании WNOHANG вообще, поэтому яЯ надеюсь, что вы можете объяснить это мне. Я'Я стараюсь ничего не блокировать, поэтому я подумал, что это сработает.

Ответы на вопрос(1)

Решение Вопроса

Просто используйтевилка создать дочерний процесс - который будет параллельным. Оттуда вы можете использоватьсемья exec * выполнять любые исполняемые файлы, которые вам нравятся, или просто запускать C-код в дочернем элементе, пока родитель возвращается и запрашивает дополнительную информацию (следующая команда и т. д.).Подождите с опцией WNOHANG в верхней части цикла, чтобы проверить наличие завершенных потомков, и снова (на этот раз без WNOHANG) в конце для остальных этих потомков.

Я должен призвать вас не делать это более сложным, чем на самом деле. Напишите, что вы хотите, на простом английском (или на вашем родном языке, или псевдокоде), а затем просто переведите это на C с минимальным количеством умов.

(Псевдо) код:

struct child {
    int pid;
    struct child * next;
    struct child * prev;
}
struct child * children = null;
do {
    int return = 0;
    struct child * curr = children;
    while(curr != null){
        if(waitpid(curr->pid, &return, WNOHANG)){
            //Report child exited with return status 'return'
            //Remove child (linked list style)
         }
         curr = curr->next;
     }
     /* PROMPT, ETC */
     if ( doInBackground ){
         int pid = fork();
         if(pid <0 )exit(); //error
         if(pid){
             //Child
             execvp(processName, arrayOfArgs);
             //This should never get executed
             exit();
         }
         //Add pid (linked list style, again)
     }
}while(!exitCondition)

int return = 0;
struct child * curr = children;
while(curr != null){
    if(waitpid(curr->pid, &return, 0)){
        //Report child exited with return status 'return'
        //Remove child (linked list style)
    }
    curr = curr->next;
}
 FrankieTheKneeMan10 окт. 2012 г., 20:03
@Requiem - Добавлен псевдокод. Обратите внимание, что в реальном мире, просто потому, чтоwaitpid возвращается, нет означает выход. Проверьте их справочную страницу для лучшей проверки ошибок.
 Requiem10 окт. 2012 г., 19:30
Поможет ли мне опубликовать код, который у меня есть, чтобы вы могли понять, как яя собираюсь об этом? Потому что я'я немного растерялся прямо сейчас.
 Requiem11 окт. 2012 г., 04:41
Добавил мой новый код в пост. Просто хотел посмотреть, смогу ли ям движется в правильном направлении или нет.
 Requiem10 окт. 2012 г., 19:34
Хорошо, я поместил код там. По какой-то причине, давайтескажи я типаls & ", он просто продолжает печатать ls снова и снова.
 Requiem10 окт. 2012 г., 19:26
Кроме того, я должен убедиться, что зомби не осталось позади, чтобыПоэтому я считаю, что мне нужно использовать waitpid.
 FrankieTheKneeMan10 окт. 2012 г., 19:31
Это буквально всегда поможет. Но невставьте это в комментарии - отредактируйте ваш оригинальный вопрос.
 FrankieTheKneeMan10 окт. 2012 г., 19:28
fork возвращает pid родителю. Ведите список дочерних идентификаторов PID, и при выходе из оболочки вы можете просто подождать каждого из них. В верхней части цикла управления просто используйте wait с WNOHANG, чтобы проверить наличие завершенных процессов и удалить их из списка активных дочерних PID.

Ваш ответ на вопрос