关于linuxC语言中创建进程,利用execlp函数执行.c程序问题

对于一个小白来说,这个系统调用真的太难了,完全摸不着头脑啊,一搜execlp函数,全是执行的命令,什么传参硬是没懂。
不过说到底,还是自己C语言的基础太薄弱了,对于int main()这样一个最常用的函数都不了解,惭愧惭愧。一般我们很少给int main()函数传递参数,以至于我都不知道int main(int argv,int *argv[])里面的这个参数是干嘛的,一度以为只是个装饰(从来没用过),直到这次用execlp函数调用执行.c文件才明白它的作用。

简单的来说,int argv是execlp系统调用时给的参数个数,而int *argv[]是execlp系统调用时给的具体的参数集合。比如argv[0]代表第一个参数,argv[1]代表第二个参数,以此类推。详情请看链接,
我就是看这个懂的 C语言main函数参数.

搞清楚这个之后呢,我们就可以玩execlp函数了,我找了好多资料,大佬们的示例永远是这样的:

对于一个小白来说,我根本不懂。我只是想简单的调用它执行一个.c程序啊!!!!!!直到看到了这篇博客才拯救了我,这才弄清楚到底怎么通过execlp传递参数,如下:

链接: 给进程指定一个新的运行程序的函数exec().

之后便畅通了,成功的运用了execlp函数。但是在传递int类型的参数数据时,被execlp调用执行的c程序怎么都get不到那个int 数据,用强制转换也不行。后来偶然间发现一个用法,忘了在哪里看到的了(找的资料实在是太多了)。如下:就可以把字符型的argv[i]转换成为整数了。

atoi(argv[i])

下面是我的具体实例,有一个读取.csv的过程,.csv文件里面的数据也在后面放上,小伙伴试验我的代码的时候,要注意修改execlp函数的参数路径哦,还有一定要用gcc -o producer producer.c和gcc -o consumer consumer.c编译一下这两个c程序。我有三个文件:procon.c—读取.csv文件的数据,并根据数据内容创建相应的进程并执行相应.c程序。producer.c 和 consumer.c文件就是两个等待被执行的.c文件,主要输出接收到的参数。(其实这是一个生产者和消费者的问题,老师改了一下,让我们练习execlp和进程创建问题)

当时我还想了好久producer和consumer都不在同一个.c程序里面了,怎么可以消息传递。然后问了老师发现并不需要进行同步互斥操作,害。不过我也写了,有兴趣的同学可以看这篇博客-- 生产者消费者同步互斥问题.这是生产者消费者的生产消费记录写入.csv文件。








以下程序还有一个问题没有解决,程序日常迷惑行为:


//如果我在procon.c文件里面定义传递参数变量的顺序为  char tm,count;
//则执行了execlp函数之后,调用consumer程序时,consumer程序里面接收到的 tm 参数是错误的。
//如果定义顺序为char count,tm;则接收到的count是错误的。
//而且那个错误的数据有规律:比如先定义tm,再定义count这种情况,假设传递的tm = 1,count = 3;那么错误数据tm = 13; //是不是非常迷惑??????发送超级多问号?????????????(等我找到原因之后再更新吧,现在是2020.4.15 20:11)if (execlp("/home/ssm/shiyan2wenjian/consumer", &tm, process, bride, name, &count, NULL) == -1)if (execlp("/home/ssm/shiyan2wenjian/consumer", &tm, process, bride, name, &count, NULL) == -1)



这便是你们要的源码啦。上面的问题虽然没有找到问题根源,但是我用一种暴力方法使它看起来正常了。那就是只显示那个错误数据的正确部分,具体就是显示 argv[0][0]。

//procon.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include<sys/sem.h>int main(int argc,char **argv)
{  FILE *fp;  char *a1 = "生产者", *a2 = "消费者";char process[100],bride[100],name[100]; //读取的文件数据存放变量int ret;char tm;char count;int p1;  //生产者进程int p2;  //消费者进程fp=fopen("/home/ssm/shiyan2wenjian/pc.csv","r");if( fp == NULL ){  return -1;  }else printf("open file suceed!\n");  while( ( ret = fscanf( fp, " %[^,], %c, %[^,], %[^,], %c ", process, &tm, bride, name, &count ) ) != EOF ){  printf( "%s %c %s %s %c\n", process, tm, bride, name, count ); if( strncmp (process, a1, 6) == 0 ) {while( (p1=fork())==-1 );if(p1 == 0) {printf("tm = %c",tm);printf("count = %c",count);if (execlp("/home/ssm/shiyan2wenjian/producer", &tm, process, bride, name, &count, NULL) == -1) printf("error\n"); exit(0);}}else if( strncmp (process, a2, 6) == 0 )   //创建消费者进程{while( (p2=fork())==-1 );if(p2 == 0) {if (execlp("/home/ssm/shiyan2wenjian/consumer", &tm, process, bride, name, &count, NULL) == -1) printf("error\n"); exit(0);}}sleep(2);}  fclose( fp );  return 0;
}  
//producer.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include<sys/sem.h>#define N 32   //32个货架int main(int argc,char **argv)
{int i;int in = 0;   //生产者放产品的位置int buf[N] = {0};   //N个货架,开始时初始化为0,没有产品/*for(i = 0; i < argc; i++)printf("arg[%d]:%s\n",i,argv[i]);tm = argv[0];process = argv[1];bride = argv[2];name = argv[3];count = argv[4];
*/for(i = 0;i < atoi(argv[4]);i++){buf[in]=1;  //放产品in=(in+1)%N;  }printf("放置时间%c, %s, 货架号:[%d,%d], 品牌:%s, 名称:%s\n\n",argv[0][0],argv[1],in-atoi(argv[4]),in-1,argv[2],argv[3]); return 0;}
//consumer.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include<sys/sem.h>#define N 32   //32个货架int main(int argc,char **argv)
{int i;int out = 0;   //消费者放产品的位置int buf[N] = {0};   //N个货架,开始时初始化为0,没有产品/*for(i = 0; i < argc; i++)printf("arg[%d]:%s\n",i,argv[i]);tm = argv[0];process = argv[1];bride = argv[2];name = argv[3];count = argv[4];
*/for(i = 0;i < atoi(argv[4]);i++){buf[out]=1;  //取产品out=(out+1)%N;  }printf("取货时间%c, %s, 货架号:[%d,%d], 品牌:%s, 名称:%s\n\n",argv[0][0],argv[1],out-atoi(argv[4]),out-1,argv[2],argv[3]); return 0;}

pc.csv文件
进程, 到达时间,品牌,产品名称,产品数量
生产者0,1,丽雅,毛巾,3
消费者1,2,金星,毛巾,2
生产者2,3,金星,毛巾,2
生产者3,4,宝佳,香皂,4
消费者4,5,丽雅,毛巾,5
消费者5,6,丽雅,香皂,5
生产者6,7,白药,香皂,2
生产者7,8,丽雅,毛巾,3

关于linuxC语言中创建进程,利用execlp函数执行.c程序问题相关推荐

  1. windows系统中创建线程常用哪几个函数,有什么区别?

    windows系统中创建线程常用哪几个函数? 在windows系统中创建线程的函数有: CreadThread,AfxBeginThread,_beginthread,_beginthreadex. ...

  2. c语言中用于获取字符串长度的函数是,C语言中求字符串长度的函数的几种实现方法...

    C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) { ass ...

  3. C语言中求字符串长度的函数my_strlen()的几种实现方法

    C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) {asse ...

  4. 【小程序】C语言实现简易钢琴-利用sin函数构造不同频率波形模拟各琴键发音

    根据钢琴音调频率对照表,使用sin函数构造对应频率正弦波数据模拟各琴键声音,实现简易钢琴效果,结果写入wav文件中. 目录 程序效果 实现过程 样例代码 测试用例 参考资料 程序效果 截图1:键位图 ...

  5. 如何在sqlite3连接中创建并调用自定义函数

    #!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sql ...

  6. C语言中的字符串转数字函数常见问题详解

    目录 C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 字符串转长整形 strtol函数, C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 函数原型: int a ...

  7. c语言常用数学函数大全查询,C语言数学函数 C语言中全部可用的数学函数有哪些?...

    导航:网站首页 > C语言数学函数 C语言中全部可用的数学函数有哪些? C语言数学函数 C语言中全部可用的数学函数有哪些? 相关问题: 匿名网友: /*--------------------- ...

  8. 习题 11.1 将例11.1的程序片断补充和改写成一个完整、正确的程序,用公用继承方式。在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值,程序应输出以上。。

    C++程序设计(第三版) 谭浩强 习题11.1 个人设计 习题 11.1 将例11.1的程序片断补充和改写成一个完整.正确的程序,用公用继承方式.在程序中应包括输入数据的函数,在程序运行时输入num, ...

  9. 习题 11.1 将例11.1的程序片断补充和改写成一个完整、正确的程序,用公用继承方式。在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值。

    习题 11.1 将例11.1的程序片断补充和改写成一个完整.正确的程序,用公用继承方式.在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值,程序应输出以上5个 ...

最新文章

  1. R画月亮阴晴圆缺:corrplot绘图相关系数矩阵
  2. 这才是真的码“农”!Linux基金会要推广开源技术种菜了
  3. c++与C# winform的消息通讯--(结构体与byte数组的使用)
  4. 台式计算机键盘配置及价格,最新台式电脑组装配置单及价格【图文】
  5. 微信公众号使用Chrome插件:Markdown Nice优化微信公众号排版教程
  6. Linux下查看串口信息
  7. nvidia-smi‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
  8. 无意间发现的java的相关资料
  9. Cocos Creator 你不知道的细节
  10. 西南科技大学OJ题 顺序栈基本操作的实现1044
  11. SVN下载项目到本地
  12. python分离gif_python 将GIF拆分成图片方法
  13. IIS 7无法写入配置文件C:\Windows\System32\inetsrv\config\applicationHost.config
  14. 分享一段工具型代码:印章抠图
  15. iframe父页面与子页面如何传值
  16. 计算两个日期之间的工作日(去掉周末和节假日)
  17. 原来当年发葫芦娃种子的才是真正的老司机
  18. VUE3.0从安装到应用 (2)
  19. web实现QQ第三方登录
  20. 解析html xml最好的模块,解析--import--htmllib--xml

热门文章

  1. 腾讯发布 3D 虚拟场景自动生成解决方案,用 AIGC 助力游戏开发提效
  2. 16 | 视图:如何实现服务和数据在微服务各层的协作?
  3. 谈谈iceCode代码高亮插件的开发问题,由我们国人开发代码高亮插件!
  4. php数组合并key value,php合并数组并保留键值的实现方法
  5. java中如何实现继承_Java继承
  6. Java学习-IO流-打印流
  7. API数据调用参数返回值说明
  8. 如何直接进入迅捷CAD官网页面上进行图纸的打开和测量?
  9. 翻译--十年自学编程
  10. @JsonIgnore