LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 958|回复: 11

[gcc] 可执行文件之间数据的非文件传递

[复制链接]
自由狼-台风 该用户已被删除
发表于 2003-7-30 11:49:57 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2003-7-30 12:14:39 | 显示全部楼层
你说的其实有一种解决方法,就是所谓的进程间通信,但是非常不推荐使用这种东西,太容易出问题了。还是写在一个程序里面,用pthread实现吧。
发表于 2003-7-30 12:22:35 | 显示全部楼层
用管道吧,简单、好用。
共享内存也可以。
自由狼-台风 该用户已被删除
 楼主| 发表于 2003-8-1 21:59:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2003-8-1 22:50:52 | 显示全部楼层
发表于 2003-8-2 13:21:02 | 显示全部楼层
用两个程序说一下。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int
  5. main(void)
  6. {
  7.   char name[20];

  8.   //write(1, "What's your name?\n: ", 20);
  9.   printf("What's your name?\n: "); /* 这里或者用write,或者用printf、fflush, */
  10.   fflush(stdout);                  /* 只用printf导致调用进程read的时候一直阻塞 */
  11.   fgets(name, 19, stdin);
  12.   name[strlen(name) - 1] = '\0';
  13.   printf("Your name is "%s".\n", name); /* 这里不用fflush,因为进程结束了 */

  14.   exit(0);
  15. }
复制代码

编译用 gcc name.c - name

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <sys/wait.h>

  5. void err_sys(char *);

  6. int
  7. main(int argc, char *argv[])
  8. {
  9.   int fd1[2], fd2[2];
  10.   pid_t pid;
  11.   int n;
  12.   char buf[100];

  13.   if(pipe(fd1) < 0)
  14.     err_sys("pipe(fd1) error");
  15.   if(pipe(fd2) < 0)
  16.     err_sys("pipe(fd2) error");

  17.   if((pid = fork()) < 0)
  18.     err_sys("fork error");
  19.   else if(pid == 0){
  20.     if(fd1[0] != STDIN_FILENO)
  21.       dup2(fd1[0], STDIN_FILENO);
  22.     if(fd2[1] != STDOUT_FILENO)
  23.       dup2(fd2[1], STDOUT_FILENO);
  24.     close(fd1[1]);
  25.     close(fd2[0]);
  26.     execl("./name", "name", (char *)0);
  27.     err_sys("execl error");
  28.   }else{
  29.     close(fd2[1]);
  30.     close(fd1[0]);
  31.     printf("This is %s\n", argv[0]);
  32.     n = read(fd2[0], buf, 99);
  33.     buf[n] = '\0';
  34.     printf(buf);
  35.     fgets(buf, 99, stdin);
  36.     write(fd1[1], buf, strlen(buf));
  37.     n = read(fd2[0], buf, 99);
  38.     buf[n] = '\0';
  39.     printf(buf);
  40.     wait(NULL);
  41.   }

  42.   exit(0);
  43. }

  44. void
  45. err_sys(char *s)
  46. {
  47.   perror(s);
  48.   exit(-1);
  49. }
复制代码

这个是按半双工管道写的。
自由狼-台风 该用户已被删除
 楼主| 发表于 2003-8-2 22:56:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2003-8-2 23:23:54 | 显示全部楼层
可行。
自由狼-台风 该用户已被删除
 楼主| 发表于 2003-8-9 18:03:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
自由狼-台风 该用户已被删除
 楼主| 发表于 2003-8-9 20:06:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表