2016-04-20 4 views
1

Я очень новичок в использовании этих различных типов системных вызовов в Linux, что привело меня к большой путанице. При этом я прошу только нажать в правильном направлении/начале, а не на завершение. Используя fork, exec и wait, я прочитал их, но это все еще не помогло мне в моей ситуации. Мне нужно сделать следующее:Понимание fork, exec и wait в C++ (Linux)

Распечатайте promt и дождитесь, когда пользователь войдет в команду с четырьмя аргументами или параметрами. «Выход» остановит программу.

Некоторые примеры, mkdir blah, создает каталог, а затем запрашивает новую команду, touch blah/this blah/that blah/there.

Мне нужно позвонить fork, чтобы создать дочерний процесс для выполнения введенной команды, а затем вызвать exec в дочернем процессе, чтобы ребенок стал программой, которая должна быть выполнена (эта часть меня смущает еще больше) и, наконец, вызовите wait в родительском процессе, чтобы интерпретатор не распечатывал следующее приглашение до завершения команды.

Что было бы лучшим способом достичь этого? Как в, как лучше всего читать в команде/arguments/options, а затем выполнить их? Я бы предположил, что было бы лучше сделать это do..while с условием while того, что проверяет «выхода»

Что мало я сделал, что не так много, я знаю.

int main() 
{ 
char command[25]; 
pid_t pid; 
int rs; 
cout << "Enter command: "; 
cin >> command; 

while(strcmp(command, "exit") != 0) { 
    pid = fork(); 

    if (pid == 0) { //child process 
    rs = execl("echo", command); 
      } 
else { // parent process 
    cout << "Enter a command: "; 
    cin >> command; 
} 

} 



return 0; 
} 
+0

'человек fork' даже есть примеры кода. Понятно, что вы предоставляете свою попытку. Код проще и точнее предлагать улучшения, чем ваш вопрос о * наилучшем способе *. –

ответ

3

общее расстройство того, что каждый из этих системных вызовов сделать:

вилка: Форкс текущего процесса. Буквально, когда вызывается fork, выполнение приостанавливается при вызове fork, и вся программа копируется в новое пространство процесса, которое является потомком оригинала. Затем оба процесса продолжают выполнение сразу после параллельного вызова fork. Вам нужно будет получить ПИД-код, чтобы узнать, является ли исполняемая программа дочерним или родительским.

exec: приостанавливает выполнение текущего процесса, вытирает текущий процесс в памяти с помощью назначенной новой программы для запуска. Затем он запускает новую программу.

wait: приостанавливает текущий процесс, пока не завершится хотя бы один дочерний процесс. Это оболочка waitpid(), которая позволяет приостановить выполнение текущего процесса и дождаться изменения состояния дочернего процесса текущего процесса (который может быть клоном самого себя или новой программой, замененной на exec)

Вот код ожидания и записи демо не разветвлением (но не Exec) из класса я взял в университете:

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <semaphore.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/stat.h> 
#include <sys/wait.h> 
const int BUFFER_SIZE = 1000; 

void copySegment(int i, int segmentSize, FILE * fin, FILE * fout) { 
    // Does not need to be shown to prove point 
} 

int main(int argc, char * argv[]) { 
    int i; 
    sem_t * sem; 
    pid_t pid; 
    FILE * fin, * fout; 
    struct stat sbuf; 
    int fileSize, fileDescriptor, segmentSize; 
    fin = fopen(argv[1], "r"); 
    fout = fopen("forkcopy.txt", "w"); 
    fileDescriptor = fileno(fin); 
    fstat(fileDescriptor, &sbuf); 
    fileSize = sbuf.st_size; 
    segmentSize = fileSize/4; 
    sem = sem_open("sem", O_CREAT | O_EXCL, 0644, 4); 
    sem_unlink("sem"); 
    for (i = 0; i < 4; i++) { 
     pid = fork(); 
     if (pid < 0) 
      printf("Fork error.\n"); 
     else if (pid == 0) 
      break; 
    } 
    if (pid != 0) { 
     while (pid = waitpid(-1, NULL, 0)) { 
      if (errno == ECHILD) 
       break; 
     } 
     sem_destroy(sem); 
     fclose(fin); 
     fclose(fout); 
     exit(0); 
    } else { 
     sem_wait(sem); 
     copySegment(i, segmentSize, fin, fout); 
     sem_post(sem); 
     exit(0); 
    } 
} 
Смежные вопросы