c языковая проблема

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

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


person user513164    schedule 19.08.2010    source источник
comment
Не могли бы вы объяснить, что именно вы подразумеваете под созданием «родительского процесса»?   -  person axel_c    schedule 19.08.2010
comment
Сам термин «родительский процесс» имеет смысл только в том случае, если у вас есть дочерний процесс. Итак, перед созданием дочернего процесса: что означает быть родительским процессом?   -  person Dirk    schedule 19.08.2010
comment
Процесс, создающий дочерний элемент, называется родительским.   -  person Praveen S    schedule 19.08.2010


Ответы (5)


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().

person Praveen S    schedule 19.08.2010

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

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

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

Когда вы разветвляете, системный вызов возвращает 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
}
person JeremyP    schedule 19.08.2010

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

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

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

person doron    schedule 19.08.2010
comment
Самый простой способ передать родительский pid дочернему — сохранить pid в переменной перед разветвлением. Ребенок также может использовать системный вызов getppid() - person JeremyP; 19.08.2010
comment
Должен был подумать об этом. Просто я толстый - person doron; 19.08.2010

  1. Чтобы создать родительский процесс, возьмите свой код для создания дочернего процесса и поменяйте местами родительский и дочерний процессы. Preto change-o, новый процесс является родительским, а старый процесс — дочерним.

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

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

person Potatoswatter    schedule 19.08.2010

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

person Hasturkun    schedule 19.08.2010