首页 > 系统相关 >使用exec函数族,父子进程分别拷贝图片前后部分

使用exec函数族,父子进程分别拷贝图片前后部分

时间:2024-06-13 20:01:52浏览次数:11  
标签:char lseek exec int 父子 fd 线程 拷贝 include

  1 #include <stdio.h>
  2 #include <sys/stat.h>
  3 #include <sys/types.h>
  4 #include <unistd.h>
  5 #include <fcntl.h>
  6 
  7 int main(int argc, const char *argv[])
  8 {
  9     int fd_r = open("./1zh.jpg", O_RDONLY);
 10     if(fd_r < 0)
 11     {
 12 //      printf("");
 13         perror("open");
 14         return -1;
 15     }
 16 
 17     int fd_w =open("cpy.jpg", O_WRONLY|O_CREAT|O_TRUNC, 0664);
 18     if(fd_w < 0)
 19     {
 20 //      printf("");
 21         perror("open");
 22         return -1;
 23     }
 24 
 25     off_t size = lseek(fd_r, 0, SEEK_END);
 26 
 27     //子进程
 28     pid_t pid = fork();
 29     if(pid > 0)
 30     {
 31         char arr1[10];
 32         sprintf(arr1, "%d", fd_r);
 33         char arr2[2];
 34         sprintf(arr2, "%d", fd_w);
 35         char arr3[10];
 36         sprintf(arr3, "%ld", size);
 37 
 38         execl("p", arr1, arr2, arr3, NULL);
 39     }
 40     else if(0 == pid)
 41     {
 42         //子进程修改到中间位置
 43         lseek(fd_r, size/2, SEEK_SET);
 44         lseek(fd_w, size/2, SEEK_SET);
 45 
 46         char c;
 47         for(int i =0; i<size/2; i++)
 48         {
 49             read(fd_r, &c, 1);
 50             write(fd_w, &c, 1);
 51         }
 52         printf("后半部分拷贝完毕\n");
 53     }
 54     else
 55     {
 56         perror("fork");
 57         return -1;
 58     }
 59 
 60     close(fd_r);
 61     close(fd_w);                                                                                                                                              
 62     return 0;
  1 #include <stdio.h>
  2 #include <sys/stat.h>
  3 #include <sys/types.h>
  4 #include <unistd.h>
  5 #include <fcntl.h>
  6 #include <stdlib.h>
  7 int main(int argc, const char *argv[])
  8 {
  9     int fd_r = atoi(argv[0]);
 10     int fd_w =atoi(argv[1]);
 11     off_t size = atoi(argv[2]);
 12                                                                                                                                                                                                                                                                   
 13     sleep(4);
 14     lseek(fd_r, 0, SEEK_SET);
 15     lseek(fd_w, 0, SEEK_SET);
 16 
 17     char c;
 18     for(int i = 0; i<size/2; i++)
 19     {
 20         read(fd_r, &c, 1);
 21         write(fd_w, &c, 1);
 22     }
 23     printf("前半部分拷贝完毕\n");
 24 
 25     close(fd_r);
 26     close(fd_w);
 27     return 0;
 28 }
~                                                                                                                                                                                                                                                                     
~                                                                                                                                                                                                                                                                     
~                                                                                                                                                                                                                                                                     
~                                                                                                                                                                                                                                                                     
~                                                                                                                                                                                                                                                                     
~                                                                                                                                                                                                                                                                     
~                                                                                                                                                                                                                                                                     

  1 #include<stdio.h>
  2 #include <sys/stat.h>
  3 #include <sys/types.h>
  4 #include <unistd.h>
  5 #include <pthread.h>
  6 #include <string.h>
  7 
  8 char buf[]="1234567";
  9 
 10 void* A(void* arg)
 11 {
 12     while(1)
 13     {
 14         printf("A线程: %s\n",buf);
 15     }
 16     pthread_exit(NULL);
 17 }
 18 
 19 
 20 void* B(void* arg)
 21 {
 22     while(1)
 23     {
 24         char t;
 25         int i=0;
 26         int j=strlen(buf)-1;
 27         while(i<j)
 28         {
 29             t=buf[i]; buf[i]=buf[j]; buf[j]=t;
 30             i++;j--;
 31         }
 32     }
 33     pthread_exit(NULL);
 34 }
 35 int main(int argc, const char *argv[])
 36 {
 37     pthread_t tid, tid1;
 38     if(pthread_create(&tid,NULL,A,NULL)!= 0)
 39     {
 40         fprintf(stderr,"pthread_create failed");
 41         return -1;
 42     }
         pthread_detach(tid1);
 43     if(pthread_create(&tid1,NULL,B,NULL)!= 0)
 44     {
 45         fprintf(stderr,"pthread_create failed");
 46         return -1;
 47     }
 48    
 50     pthread_join(tid, NULL);
 51 
 52 
 53                                                                                                                                                                                                                                           
 54     return 0;
 55 }
~                                                                                                                                                                                                                                             
~                                                                                                                                                                                                                                             
~                                                                                                                                                                                                                                             
~                                                                                                                                                                                                                                             

分析:经过测试,将子进程A使用pthread_detach函数加入到创建进程A的程序下时候可以避免乱码的输出,

分离A线程; 被分离的A线程的资源将被自动回收,不需要使用pthread_join回收了; 当tid线程被分离后,phtread_join tid线程不阻塞,线程A不会再输出线程B过程中未全部的完成的过程乱码。

标签:char,lseek,exec,int,父子,fd,线程,拷贝,include
From: https://blog.csdn.net/qq_51852604/article/details/139634767

相关文章

  • python运行js代码拿到逆向数据-execjs库
    #前提安装了node.js并且设置环境变量https://blog.csdn.net/bestyellow/article/details/119820509importsubprocessfromfunctoolsimportpartialsubprocess.Popen=partial(subprocess.Popen,encoding='utf-8')importexecjs#如果funcs_name是js代码里面的函数名字var代......
  • vue 父子组件交互 props,emit,slot
    props 子组件可以通过 props 从父组件接受动态数据vue2 vue3defineProps() 是一个编译时宏,并不需要导入   emit()emit()子组件向父组件触发事件vue2this.$emit() 的第一个参数是事件的名称。其他所有参数都将传递给事件监听器。 vue3emit() 的第一个参......
  • c++在什么情况下会发生拷贝?
    在C++中,对象拷贝通常会在以下情况下发生:传递参数给函数:当你将对象作为参数传递给函数时,如果参数是按值传递的,那么会发生拷贝。例如:voidfunc(MyClassobj);//obj会被拷贝从函数返回对象:当函数返回一个对象时,如果函数返回的是对象本身而不是引用或指针,会发生拷贝。例......
  • 【FFmpeg】SDL 音视频开发 ② ( SDL 视频显示函数 | 设置渲染器目标纹理 | 设置渲染器
    文章目录一、SDL视频显示函数1、SDL的渲染器和纹理之间的关系2、SDL_SetRenderTarget函数-设置渲染器目标纹理3、SDL_SetRenderDrawColor函数-设置渲染器颜色4、SDL_RenderClear函数-清除渲染器5、SDL_RenderDrawRect函数-渲染器绘制矩形6、SDL_Render......
  • 电脑防止拷贝怎么设置?操作简单,拿走不谢!
    在这个信息爆炸的时代,电脑中的数据安全显得尤为重要。是否担心自己的重要文件、设计稿、商业机密被轻易拷贝泄露?点击获取软件https://work.weixin.qq.com/ca/cawcde06a33907e60a今天,就为大家带来4个简单实用的方法,帮助你轻松设置电脑,防止数据被非法拷贝!方法一:使用加密软件......
  • 数据类型与深浅拷贝理解 vs 不同语言环境下深浅拷贝实例
    一、在探讨深浅拷贝的问题之前需要先理解两种数据类型值类型数据(基本数据类型):存储在栈内存,占据固定大小的空间,直接存储其数据(值的赋值是深拷贝);引用类型数据:这种数据类型的变量通常存储在栈区,存的是指向实际数据的指针,而实际的数据是存储在堆区,访问数据通过指针去访问(值的赋值......
  • go的深拷贝跟浅拷贝
    Golang面试官:聊一聊浅拷贝和深拷贝原创 吃个大西瓜 CodingBigTree 2024-06-0908:01 北京 听全文浅拷贝和深拷贝浅拷贝后的对象和源对象是同一个对象,值被修改,原值的数据也会被修改深拷贝后的对象,是一个全新的对象,和源对象没有关系,修改值不会相互影响浅拷贝示......
  • 浅拷贝与深拷贝全面解析及实战
    在JavaScript学习中,拷贝是很重要的一个知识点。拷贝主要分为浅拷贝(ShallowCopy)和深拷贝(DeepCopy)。本文将阐述两者的概念,还将通过手写示例深入探讨如何实现这两种拷贝方式,以及它们在实际应用中的考量。浅拷贝:表面级复制浅拷贝只复制对象的第一层属性,对于嵌套对象或数组,仅复......
  • ExecuteReader 获取数据集的基础使用
    ///<summary>///获取多个结果集///</summary>///<paramname="sql"></param>///<returns></returns>///<exceptioncref="Exception"></exception>publicstaticSqlDataReaderGetReader(strings......
  • LangChain AgentExecutor invoke跟踪记录(一)
    目的追踪与调用LLM相关的整条链路,用于理解langchainAgent调用LLM时整个输入输出逻辑,方便后续针对不同LLM做改造适配跟踪记录第一步自然是导进chains\base.py的invoke函数,在这里经过简单的输入验证后进入self._calltry:self._validate_inputs(inputs)......