当前位置: 技术问答>linux和unix
linux中用fork启动新进程后,我有一些疑问!请大家帮忙解释下!
来源: 互联网 发布时间:2015-10-25
本文导语: 用fork启动子进程后,那么子进程应该和父进程一样代码. 那么子进程在启动后,执行代码如果是从main中开始,子进程不是有要执行fork吗? 这里我就是很迷惑到底子进程是怎么执行代码的!比如下面一个代码子进程是怎么...
用fork启动子进程后,那么子进程应该和父进程一样代码. 那么子进程在启动后,执行代码如果是从main中开始,子进程不是有要执行fork吗? 这里我就是很迷惑到底子进程是怎么执行代码的!比如下面一个代码子进程是怎么执行的啊!他还建立管道吗!如果建立了 2个进程都有管道 怎么区分哦!
#include
#include
int main()
{
int data_processed;
int file_pipes[2];
const char some_data[] = "123";
char buffer[BUFSIZ + 1];
pid_t fork_result;
memset(buffer, '', sizeof(buffer));
if (pipe(file_pipes) == 0) {
fork_result = fork();
if (fork_result == (pid_t)-1) {
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}
if (fork_result == 0) {
sprintf(buffer, "%d", file_pipes[0]);
(void)execl("pipe4", "pipe4", buffer, (char *)0);
exit(EXIT_FAILURE);
}
else {
data_processed = write(file_pipes[1], some_data,
strlen(some_data));
printf("%d - wrote %d bytesn", getpid(), data_processed);
}
}
exit(EXIT_SUCCESS);
}
#include
#include
int main()
{
int data_processed;
int file_pipes[2];
const char some_data[] = "123";
char buffer[BUFSIZ + 1];
pid_t fork_result;
memset(buffer, '', sizeof(buffer));
if (pipe(file_pipes) == 0) {
fork_result = fork();
if (fork_result == (pid_t)-1) {
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}
if (fork_result == 0) {
sprintf(buffer, "%d", file_pipes[0]);
(void)execl("pipe4", "pipe4", buffer, (char *)0);
exit(EXIT_FAILURE);
}
else {
data_processed = write(file_pipes[1], some_data,
strlen(some_data));
printf("%d - wrote %d bytesn", getpid(), data_processed);
}
}
exit(EXIT_SUCCESS);
}
|
子进程是不会从main开始执行的。
子进程也继承了父进程得pc指针。从上面得例子,就是从
sprintf(buffer, "%d", file_pipes[0]); 开始执行
子进程也继承了父进程得pc指针。从上面得例子,就是从
sprintf(buffer, "%d", file_pipes[0]); 开始执行
|
子进程与父进程在那一个点上有相同的pc指针,也就是说子进程的下一条指令在接收fork的返回值上。
|
你可以把下面看成一个整体,也就是产生了新的进程。因为fork是返回两次值,相当于下面的执行了两次,第一次fork()返回的是一个值,第二次返回另一个值,到底是执行哪一部分,这个要具体分析。
fork_result = fork();
if (fork_result == (pid_t)-1) {
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}//失败
if (fork_result == 0) {
//子进程
sprintf(buffer, "%d", file_pipes[0]);
(void)execl("pipe4", "pipe4", buffer, (char *)0);
exit(EXIT_FAILURE);
}
else {
//父进程
data_processed = write(file_pipes[1], some_data,
strlen(some_data));
printf("%d - wrote %d bytesn", getpid(), data_processed);
}
记住这个模块吧
fork_result = fork();
if (fork_result == (pid_t)-1) {
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}//失败
if (fork_result == 0) {
//子进程
sprintf(buffer, "%d", file_pipes[0]);
(void)execl("pipe4", "pipe4", buffer, (char *)0);
exit(EXIT_FAILURE);
}
else {
//父进程
data_processed = write(file_pipes[1], some_data,
strlen(some_data));
printf("%d - wrote %d bytesn", getpid(), data_processed);
}
记住这个模块吧
|
生成一个完全拷贝,当然包括下条要执行的计数器了。不同的知识fork的返回值,这就是父子进程借以判断自己下面要执行的代码了。
|
子进程是从主进程的fork之后开始执行。
fork成功后,父子进程成为系统独立的进程,争夺系统资源。
fork成功后,父子进程成为系统独立的进程,争夺系统资源。
|
子进程没有建立管道的代码,因此不建立