Альтернативы execvp для копирования файла, после завершения копирования я хочу, чтобы он уведомлял

У меня есть код c, который использует функции fork и execvp. Цель кода — скопировать src_file в target_path после завершения копирования, уведомить пользователя о его статусе. (распечатать сообщение)

Я знаю, что использование execvp заменит текущий образ процесса. что я хотел знать, так это то, есть ли какие-либо альтернативы, например, чтобы после завершения cmd, данного execvp, управление возвращалось в мою программу и запускало последующий код.

pid = fork();
if (pid == 0) {
  /* child path */
  printf("Hello, This is CHILD(%d).\n", getpid());
  execvp("cp", av);
  printf("Completed Copying\n");
}
else {
  /* Parent's path */
  printf("Hello, This is PARENT(%d).\n", getpid());
  wait(NULL);
}

person Sheetal T    schedule 23.10.2012    source источник
comment
Pthreads.   -  person    schedule 23.10.2012
comment
система int(const char *command);   -  person ZhangChn    schedule 23.10.2012
comment
У вас есть вызов wait(), который сделает то, что вы упомянули. Как это не достаточно для того, что вам нужно?   -  person nos    schedule 23.10.2012
comment
вы всегда можете скопировать его вручную, открыв 2 потока   -  person DanZimm    schedule 23.10.2012
comment
Педантично execvp заменяет текущую программу, а не текущий процесс. Вот как наследуются такие вещи, как блок среды, таблица дескрипторов файлов (например, перенаправление оболочки), UID, umask и т. д.   -  person cdarke    schedule 23.10.2012


Ответы (1)


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

По следующей ссылке показано, как проверить статус и возвращаемые значения. копировать файл

В качестве альтернативы, почему бы вам не использовать fopen() или open() как для исходного, так и для целевого файлов и копировать в цикле с использованием кода, то есть с использованием API для чтения и записи. Это быстрее всего, и вам больше не нужно вызывать внешний двоичный файл cp для достижения вашей цели.

person fkl    schedule 23.10.2012
comment
@user1659436 user1659436 Также попробуйте явно использовать pipe(), это самый быстрый способ! - person Grijesh Chauhan; 23.10.2012