Следующая программа разветвляет дочерние процессы, и каждый процесс создает файл .bak
, используя команду cp
, с тем же именем, что и имя файла, указанное в списке аргументов, передаваемых программе. Поскольку последний аргумент - dir_dest
, я предполагаю, что это каталог назначения, в котором дочерние процессы должны создавать .bak
файлы. Следуйте встроенным комментариям программы:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define FL_EXTN ".bak"
#define PLEN 256
#define NLEN 64
void usage(const char* prog_name) {
printf("Usage:\n\t%s: file1 file2 ... fileN dir_dest.\n", prog_name);
}
int main(int argc, char *argv[]) {
char arg1[NLEN];
char dir_dest[PLEN];
// adding check for argc < 3, as it need minimum 2 arguments
// a file_name and dir_dest
if (argc < 3) {
usage(argv[0]);
exit(EXIT_FAILURE);
}
// add the command line argument validations
// for e.g. dir_dest is valid or not
strcpy (dir_dest, argv[argc - 1]);
// run loop for argc - 2 time as the first argument is process name and
// last is dir_dest, rest are files to be copy with .bak extension
for (int j = 0; j < argc - 2; j++) {
// leaving it up to you to add a check whether file argv[j+1]
// exits or not. Below code is based on assumption that files exist
strcpy (arg1, argv[j+1]);
// fork child process
pid_t child_pid = fork();
if (child_pid == 0) {
// in child process
char *cmdpath = "/bin/cp";
char *cmd = "cp";
char arg2[PLEN];
// prepare the .bak file absolute path using dir_dest
snprintf (arg2, PLEN, "%s/%s%s", dir_dest, arg1, FL_EXTN);
// replace child process with cp
execl(cmdpath, cmd, arg1, arg2, NULL);
// get here only if execl fails
perror("execl failed");
// exit child process
exit(1);
} else {
// in parent process
if (child_pid > 0) {
printf("%d: child created with PID %d\n", getpid(), child_pid);
} else {
perror("Fork error");
exit(1);
}
}
}
return 0;
}
Дополнительно:
Использование void
в качестве типа возврата функции main
не соответствует стандартам. Возвращаемый тип функции main
должен быть int
.