LinuxSir.cn,穿越时空的Linuxsir!

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

程序运行结束后终端不会出现命令提示符?

[复制链接]
发表于 2010-6-18 23:44:48 | 显示全部楼层 |阅读模式
就这个程序,运行后终端不会出现“lucifer@cross:~/C$“这个字符串的,但是输入的命令却照样执行。gdb说这个程序结束正常,开头也同样没有出现“(gdb)”字串。

这是怎么回事?

  1. lucifer@cross:~/C$ cat mkfifo.c
  2. /* 建立命名管道 */
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>

  8. #define FIFO "/tmp/fifo"

  9. int
  10. main()
  11. {
  12.         char buffer[80];
  13.         int fd;
  14.         unlink(FIFO);
  15.         mkfifo(FIFO, 0666);
  16.         if(fork() > 0)
  17.         {
  18.                 char s[] = "Hello World!\n";
  19.                 fd = open(FIFO, O_WRONLY);
  20.                 write(fd, s, sizeof(s));
  21.                 close(fd);
  22.         }
  23.         else
  24.         {
  25.                 fd = open(FIFO, O_RDONLY);
  26.                 read(fd, buffer, 80);
  27.                 printf("%s", buffer);
  28.                 close(fd);
  29.         }
  30.         return 0;
  31. }

  32. lucifer@cross:~/C$ ./a.out
  33. lucifer@cross:~/C$ Hello World!
  34. sudo fdisk -l
  35. [sudo] password for lucifer:

  36. Disk /dev/sda: 250.1 GB, 250059350016 bytes
  37. 255 heads, 63 sectors/track, 30401 cylinders
  38. Units = cylinders of 16065 * 512 = 8225280 bytes
  39. Sector size (logical/physical): 512 bytes / 512 bytes
  40. I/O size (minimum/optimal): 512 bytes / 512 bytes
  41. Disk identifier: 0x7b8466c5

  42.    Device Boot      Start         End      Blocks   Id  System
  43. /dev/sda1   *           1        3825    30724281    7  HPFS/NTFS
  44. /dev/sda2            3826       27726   191984393    5  Extended
  45. Partition 2 does not end on cylinder boundary.
  46. /dev/sda4           27727       30401    21486937+   7  HPFS/NTFS
  47. /dev/sda5            3826        3837       96358+  83  Linux
  48. /dev/sda6            3838        4335     4000153+  82  Linux swap / Solaris
  49. /dev/sda7            4336        6563    17896378+  83  Linux
  50. /dev/sda8            6564       10327    30233600    7  HPFS/NTFS
  51. /dev/sda9           10328       12817    19998720   83  Linux
  52. /dev/sda10          12817       19664    54999040   83  Linux
  53. /dev/sda11          19665       22154    19998720   83  Linux
  54. /dev/sda12          22154       24644    19998720   83  Linux
  55. /dev/sda13          24644       27726    24757248   83  Linux
  56. lucifer@cross:~/C$
复制代码
发表于 2010-6-19 10:08:45 | 显示全部楼层
没有重现你所说现象,使用xfce terminal.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-19 19:44:45 | 显示全部楼层
没装xfce,。

我用tty终端还是一样。。。
回复 支持 反对

使用道具 举报

发表于 2010-6-24 17:22:29 | 显示全部楼层
关键字 fork 时间片...

helloworld和提示符谁先出现不确定吧...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-28 16:05:47 | 显示全部楼层
Post by adaml;2098724
关键字 fork 时间片...

helloworld和提示符谁先出现不确定吧...


那么,要怎么避免出现这个问题呢?
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>

  6. #define FIFO "/tmp/fifo"

  7. int
  8. main()
  9. {
  10.         char buffer[80];
  11.         int fd;
  12.         unlink(FIFO);
  13.         mkfifo(FIFO, 0666);
  14.         pid_t pid;

  15.         if((pid = vfork()) == -1)
  16.                 perror("vfork error");
  17.         else if(pid > 0)
  18.         {
  19.                 fd = open(FIFO, O_RDONLY);
  20.                 read(fd, buffer, 80);
  21.                 printf("%s", buffer);
  22.                 close(fd);

  23.         }
  24.         else if(pid == 0)
  25.         {
  26.                 char s[] = "Hello World!\n";
  27.                 fd = open(FIFO, O_WRONLY);
  28.                 write(fd, s, sizeof(s));
  29.                 close(fd);
  30.         }
  31.         return 0;
  32. }
复制代码

用vfork也不行。直接就没输出了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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