С языковой проблемой - PullRequest
       16

С языковой проблемой

0 голосов
/ 19 августа 2010

У меня проблема с переменным током, может ли кто-нибудь мне помочь.я написал код создания процесса на языке c, он использует вызов pid & fork ().теперь вызов fork используется для создания дочернего процесса. Может ли кто-нибудь сказать мне, как создать родительский процесс?я знаю, что создание дочернего процесса делает процесс родительским автоматически, но я хочу сделать родительский процесс с самого начала, поэтому любой может сказать мне, как это сделать, во-вторых, я просто создаю процесс, я не знаю, как его использоватьесли я не могу назначить ему какую-либо работу (вычисление). Кто-нибудь может мне сказать, как использовать этот процесс для работы?

Третий: я хочу дать имя своему процессу, как я могу это сделать и какя могу контролировать их выполнение?пожалуйста, если кто-нибудь может просветить меня, пожалуйста, помогите мне понять все это.я буду благодарен за это навсегда, спасибо заранее

Ответы [ 5 ]

4 голосов
/ 19 августа 2010

Вызов fork создает новый процесс, идентичный существующему процессу, за исключением нескольких незначительных различий, таких как его pid, родительский pid. Исходный процесс происходит точно из того же места, и этот является родительским процессом. Что означает, что ваш вопрос в принципе не имеет смысла. Вы не создаете родительский процесс, исходный процесс становится родительским процессом после создания дочернего процесса.

Это немного похоже на вопрос: «Я создал ребенка, забеременев и рожая, но как мне создать родителей?» Вы автоматически являетесь родителем.

Вернуться к компьютерам ...

Когда вы выполняете fork, системный вызов возвращает pid дочернего элемента родительскому элементу и 0 дочернему элементу, поэтому у вас должен быть такой код:

int pid = fork();
if (pid == 0)
{
    // in child, do child processing - normally exec an executable
}
else if (pid > 0)
{
    // in parent, do some processing - often wait for child to complete
}
else
{
    // fork failed -  handle the error
}
1 голос
/ 19 августа 2010

Когда вы разветвляете процесс, один процесс становится двумя процессами. Каждый продолжает бежать в одном и том же месте. Единственное отличие состоит в том, что ответвление возвращает PID дочернего процесса родительскому процессу и возвращает значение 0 дочернему процессу.

Без какой-либо помощи дочерний процесс не знает своего родителя. Если двум процессам необходимо обмениваться данными друг с другом, им нужно будет использовать какой-то механизм IPC.

Распространенной формой IPC является труба. Если кто-то открывает каналы перед разветвлением, то и дочерний, и родительский элементы сохраняют дескрипторы открытого файла. Это позволит обоим процессам общаться друг с другом. Теперь родитель может свободно сообщить свой PID дочернему процессу, если это необходимо.

0 голосов
/ 19 августа 2010

О переименовании (я полагаю, вы имеете в виду имя, отображаемое ps), чтобы «переименовать» процесс, просто скопируйте ваше новое имя в argv[0]

0 голосов
/ 19 августа 2010
Secondly i just create the process i don't know how to use it i cant assign any 
work(computation) to it

Вам нужно использовать fork и exec в паре, чтобы запустить программу, которую вы хотите выполнить. Вот вики-ссылка для получения дополнительной информации.

Fork-exec is a commonly used technique in Unix whereby an executing process spawns a new program. fork() is the name of the system call that the parent process uses to "divide" itself ("fork") into two identical processes. After calling fork(), the created child process is actually an exact copy of the parent - which would probably be of limited use - so it replaces itself with another process using the system call exec().

0 голосов
/ 19 августа 2010
  1. Чтобы создать родительский процесс, возьмите код для создания дочернего элемента и поменяйте местами родительский и дочерний процессы. Presto change-o, новый процесс - родительский, а старый - дочерний.

  2. Для связи между процессами используйте pipe(2) или несколько. Также имеется разделяемая память .

  3. Для управления выполнением используйте kill(2) и wait(2). Я не уверен в назначении имен, возможно, нам нужно знать, на какой платформе вы находитесь.

...