2010-08-19 134 views
0

我有一个c问题,任何人都可以帮助我。我用c语言编写了一个进程创建代码,它使用fork()调用pid &。 fork调用现在可以用来制作子进程,任何机构都可以告诉我如何制作父进程?我知道在创建一个孩子的过程中自动创建父进程,但我想从一开始就让父进程,所以任何人都可以告诉我如何做到这一点, 其次,我只是创建过程,我不知道如何使用它我不能分配任何工作(计算)给它,任何人都可以告诉我如何使用该过程的工作?c语言问题

第三个我想给我的过程命名我该怎么做&我怎么能控制他们的执行? 如果有人能够赐教,请帮我理解这一切。 我应该感谢全力为这个永远 由于事先

+0

您能否通过创建“父进程”来解释您的意思? – 2010-08-19 09:34:09

+0

如果你有一个子进程,那么“父进程”这个术语是唯一有意义的。那么,在创建一个孩子之前:它是什么意思?是一个“父过程”? – Dirk 2010-08-19 09:42:35

+0

创建子进程称为父进程。 – 2010-08-19 10:27:46

回答

0
Secondly i just create the process i don't know how to use it i cant assign any 
work(computation) to it 

您需要使用fork和exec使它运行您要执行的程序。 这是wiki link欲了解更多信息。

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
  1. 要创建一个父进程,把你的代码创建一个孩子和反向父母和孩子的角色。 Presto change-o,新进程是父进程,旧进程是孩子。

  2. 对于进程之间的通信,请使用pipe(2)或几个。另外,还有shared memory

  3. 要控制执行,请使用kill(2)wait(2)。我不确定分配名称,我们可能需要知道您的平台。

1

当你fork一个进程时,一个进程变成两个进程。每个继续在完全相同的地方运行。唯一的区别是fork将子进程的PID返回给父进程,并将值0返回给子进程。

没有任何帮助,子进程不知道它的父进程。如果两个进程需要相互通信,那么他们将需要使用某种IPC机制。

IPC的常见形式是pipe。如果在分叉之前打开管道,则子代和父代都保留打开的文件描述符。这将允许两个进程相互通信。如果需要,家长现在可以自由地将其PID传达给子流程。

+2

将父pid传递给孩子的最简单方法是在派生前将pid保存到变量中。孩子也可以使用系统调用'getppid()' – JeremyP 2010-08-19 11:01:24

+0

应该有这个想法。只是我很厚 – doron 2010-08-19 11:30:09

4

叉呼叫创建了一个新的过程,是相同的,除了一些微小差异现有工艺如它的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 
} 
0

有关重命名(我假设你的意思的名字显示为ps),以“重命名”一个过程,只需将您的新名称复制到argv[0]