LINUX.ORG.RU

Передача имени файла дочернему процессу

 ,


0

1

Задача такая: Родительский процесс создает n дочерних процессов и передает им поочередно числа из последовательности от 1...m.Дочерний процесс при создании принимает имя файла. При работе дочерний процесс получает числа от родительского процесса и пишет их в файл.

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

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>

int main (void) {
	int n;
	int i=0;
	int status;
	char c;
	printf("Сколько дочерних процессов создать?\n");
	scanf("%d", &n);
        pid_t p; 

for(i=0;i<n;i++)
{
	if (fork( ) != 0) 
	{
		waitpid(-1, &status, 0); 
	} 
	else 
	{
		char * program = "/home/user/file";
		char * argv[] = {"/home/user/file","aux", NULL};
		char * envp[] = {NULL};
		int ret;
		ret = execve(program, argv, envp);	 
		exit(0);		
	}

}
}

Ответ на: комментарий от FilosofeM

Какой еще процесс? может поток?

Обычный процесс. Причем тут потоки вообще?

Deleted
()
Ответ на: комментарий от FilosofeM

Но я вроде и не просил:) Хотел разобраться с тем, как «Дочерний процесс при создании принимает имя файла». А причем тут поток?

timas-cs
() автор топика

Не совсем понимаю как работает execve

Да нет, всё верно понимаешь.

Другое дело, что судя по твоему заданию — от тебя не это просят.

Deleted
()
Ответ на: комментарий от FilosofeM

Какой еще процесс? может поток?

Может сначала подучить матчасть, перед тем как выёживаться, господин студент?

no-such-file ★★★★★
()
Ответ на: комментарий от Deleted

Тогда так сформулирую: в задании сказано, что дочерний процесс при создании принимает имя файла. Если я просто после fork() сделаю

char c1;
printf("Введите имя файла\n");
scanf("%s", &c1);


Является ли это корректным? Вдруг это делается по-другому. 
timas-cs
() автор топика
Ответ на: комментарий от timas-cs

Почитай про аргументы функции main argc и argv.

anonymous
()

Вообще не понял, зачем тебе execve в принципе. Почему нельзя

При работе дочерний процесс получает числа от родительского процесса и пишет их в файл

реализовать в той же программе? Судя по всему тебе нужен pipe, посмотри в man там есть пример как это делается.

С другой стороны, если нужно именно стороннюю прогу запускать, то почему не взять popen?

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

реализовать в той-же программе

Ощущение, что задание формулировали для систем, не поддерживающих форк. Если это вузовская методичка, там еще со времен ДОСа могли остаться артефакты.

Deleted
()

1) Твое форматирование ужасно. Вот так должны идти отступы.

int main(...) {
    pid_t p;
    for(...) {
        if (fork( ) != 0)
        ...
    }
}
2) Зачем у тебя exit после execve? Если exec отработает успешно, то последующий код все равно не будет исполняться. Если нет... ну ты все равно не проверяешь код ошибки.

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

Зачем у тебя exit после execve?

Затем, что делать сыну всё равно нечего, а то что это и так конец main(), так это только сейчас, потом может и что добавиться.

vodz ★★★★★
()

Дочерний процесс при создании принимает имя файла

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
  pid_t pid;
  size_t i;
  const size_t MAX_FILE_NAME = 100;
  char file_name[MAX_FILE_NAME];

  for (i = 0; i < 3; ++i) {
    snprintf(file_name, MAX_FILE_NAME, "Foo_%d.txt", i);
    if ((pid = fork()) == -1)
      exit(-1);

    if (pid != 0) {
      // Parent
      printf("I send file name: %s\n", file_name);
    } else {
      // Child
      printf("I recv file name: %s\n", file_name);
      break;
    }
  }
  return 0;
}
AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

Спасибо Вам! Всем остальным, кто откликнулся, тоже большое спасибо!!!

timas-cs
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.