fork()

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40395404/article/details/78453845

fork:系统调用   ->    复制父进程

#include <unistd.h>  
#include <stdio.h>  
int main() {  
    pid_t fpid;//fpid表示fork函数返回的值  
    //printf("fork!");  
    printf("fork!/n");  
    fpid = fork();  
    if (fpid < 0)  
        printf("error in fork!");  
    else if (fpid == 0)  
        printf("child: %d/n", getpid());  
    else  
        printf("parent:%d/n", getpid());  
    return 0;  
}  


执行结果:
fork!
    parent : 3361
    child :3362
    如果把语句printf("fork!/n");注释掉,执行printf("fork!");
    则新的程序的执行结果是:
    fork!parent :3298
    fork!child :3299

分析:
这就跟printf的缓冲机制有关了,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上。但是,只要看到有/n 则会立即刷新stdout,因此就马上能够打印了。
    运行了printf("fork!")后,“fork!”仅仅被放到了缓冲里,程序运行到fork时缓冲里面的“fork!”  被子进程复制过去了。因此在子进程度stdout缓冲里面就也有了fork! 。所以,你最终看到的会是fork!  被printf了2次!!!!
    而运行printf("fork! /n")后,“fork!”被立即打印到了屏幕上,之后fork到的子进程里的stdout缓冲里不会有fork! 内容。因此你看到的结果会是fork! 被printf了1次!!!!
eg1:
eg2:
结果:

eg3:

结果:


fork被输出的三种情况:
1.缓冲区放满了
2.没放满,强制刷新("\n")
3.程序结束的时候


pid可唯一标识进程
父进程的fork号是子进程
子进程的fork号是0

写时拷贝:以页为单位
父子进程先是共享代码,当子进程对代码进行修改时,才进行拷贝



父子进程中打印的某个变量的地址是逻辑地址,不是物理地址

在父进程中打开的文件,经过fork复制,在子进程中任然可以访问,父子进程共享文件的偏移量


///////////////////////////////////////////////////////////////////////////////////////////

Fork和vfork的区别:

Vfork产生的子进程和父进程完全共享地址空间,包括代码段、数据段和堆栈段,子进程对这些共享资源的修改会影响父进程。So,vfork与其说产生了一个进程,不如说产生了一个线程

Vfork产生的子进程一定会先于父进程运行,父进程调用vfork()后会等待子进程运行后再运行



Linux下用systerm()调用shell指令

#include<stdlib.h>

Int system(const char* cmdstring); //cmdstring是要执行的shell命令

//fork+exec

Eg:system(“ls  >  tmp.txt”) //使用system命令执行ls命令,并将结果输入到tmp.txt文件

//可以使用shell源字符’>’或’|’

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

int system(const char* cmdstring)
{
pid_t pid;
int status;

if(cmdstring==NULL)
return 1;

pid=fork();

if(pid<0)
status=-1;
else if(pid==0)
{
execl("/bin/sh","sh","-c",cmdstring,NULL);  //ti huan zijincheng
_exit(127);  //tihuan shibai tuichu zijincheng
}
if(waitpid(pid,&status,0)==-1)  //huode zijincheng de tuichuma
status=-1;

return status;
}
展开阅读全文

fork()函数入门级问题:fork()与进程数

09-05

这样一段代码:rn最后还剩2个进程?为什么呢?rn我的意见是 初始父进程 在第一次fork()后终止;第一子进程在第二次fork()后终止,然后就只剩下第二子进程了???rn[code=C/C++]rnif ( (pid=fork())<0 )rn printf("error fork()\n");rn exit(1) ;rn rnrn else if (pid!=0) rn exit(0);rn rnrn// ...............................................................some other ,but have no fork() rnrn if ( (pid=fork()<0) )rn fputs("error fork()\n",stdout);rn exit(1) ;rn rn else if (pid!=0) rn exit(0);rn rn[/code]rnrn这是完整的源码:rn[code=C/C++]rnvoid daemonize(const char *cmd)rnrn int i,fd0,fd1,fd2;rn pid_t pid;rn struct rlimit rl;rn struct sigaction sa;rnrn umask(0);rnrn if ( getrlimit(RLIMIT_NOFILE,&rl)<0 )rn printf("%s can't get file limit.\n",cmd);rn exit(1) ;rn rnrn if ( (pid=fork())<0 )rn printf("error fork()\n");rn exit(1) ;rn rnrn else if (pid!=0) rn exit(0);rn rnrn setsid();//creates a session and sets the process group ID.rnrn sa.sa_handler = SIG_IGN;rn sigemptyset(&sa.sa_mask);rn sa.sa_flags=0;rn if (sigaction(SIGHUP,&sa,NULL)<0)rn printf("error sigaction()");rn exit(1) ;rn rnrn if ( (pid=fork()<0) )rn fputs("error fork()\n",stdout);rn exit(1) ;rn rn else if (pid!=0) rn exit(0);rn rn/*rn if ( chdir("/tmp")<0 )rn FILE *fp=fopen("err","w");rn fprintf(fp,"%d",errno);rn fprintf(fp,"woj");rnrn printf("error chdir()\n");rn exit(1) ;rn rn*/rnrn if (rl.rlim_max == RLIM_INFINITY)rn rl.rlim_max = 1024;rn rn for(i=0;i 论坛

没有更多推荐了,返回首页