fork vfork .

vfork用于创建一个新进程,而该新进程的目的是exec一个新程序。vfork与fork一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit),于是也就不会存访该地址空间。不过在子进程调用exec或exit之前,它在父进程的空间中运行。这种工作方式在某些UNIX的页式虚存实现中提高了效率(与上节中提及的,在fork之后跟随exec,并采用在写时复制技术相类似)。
vfork和fork之间的另一个区别是vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。(如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。)

/**** vfork ******/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <STDIO h="">
#include <STDLIB h="">
#include <STRING h="">

int
main(void)
{
  FILE* pfile = fopen("/home/jack/AAA.txt", "w");
  pid_t pid;
  char buf[256] =   { 0 };
  if ((pid = vfork()) < 0)
    {
      printf("fork error!");
    }
  else if (pid == 0) //child
    {
      sleep(1); //不管sleep多久都先执行
      strcpy(buf, "1234656789");
      fwrite(buf, 9, 1, pfile);
      printf("child %d", getpid());
      strcpy(buf, "ABCDEFGHI");
      exit(0);
    }
  else
    {
      fwrite(buf, 9, 1, pfile);
      printf("parent: %d\n", getpid());
      fclose(pfile);
    }
  printf("after child changed buf---> %s \n",buf); //子进程使用的是父进程的空间,so..
  return 0;
}
</STRING></STDLIB></STDIO>


 

 关于fork()
   1)子进程获得父进程数据空间、堆和栈的复制品。注意,这是子进程所拥有的拷贝。父、子进程并不共享这些存储空间部分。如果正文段是只读的,则父、子进程共享正文段。
   2)一般来说,在fork之后是父进程先执行还是子进程先执行是不确定的。
   3)在重新定向父进程的标准输出时,子进程的标准输出也被重新定向。实际上,fork的一个特性是所有由父进程打开的描述符都被复制到子进程中。父、子进程每个相同的打开描述符共享一个文件表项。 共享文件的话,会使用同一个文件位移量。如下:

/*** 子进程与父进程 共享同一个文件 ,它们使用了同一个文件位移量 ***/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(void)
{
  FILE* pfile = fopen("/home/jack/AAA.txt", "w");
  pid_t pid;
  char buf[256] =   { 0 };
  if ((pid = fork()) < 0)
    {
      printf("fork error!");
    }
  else if (pid == 0) //child
    {
      sleep(1); //让父进程先执行(但不一定能保证父进程先执行)
      printf("child file pos: %d\n",ftell(pfile)); //这里打印的结果是9 说明偏移 更新了。
      strcpy(buf, "1234656789");
      fwrite(buf, 9, 1, pfile);
      printf("child %d", getpid());
      exit(0);
    }
  else
    {
      strcpy(buf, "ABCDEFGHI");
      fwrite(buf, 9, 1, pfile); 
      printf("parent: %d\n", getpid());
      fclose(pfile);
    }
  printf("parent buf---> %s \n",buf); //两进程的内存空间是相互独立的
  return 0;
}
/**************
AAA.txt的内容是:ABCDEFGHI123465678 
***************/



 

源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值