Chinaunix

标题: 如何在c语言中实现ctrl+z。 [打印本页]

作者: fengyetang    时间: 2008-11-25 17:46
标题: 如何在c语言中实现ctrl+z。
如题,我现在要向某个程序发送一串数据,其中包括"ctrl+z"的操作,要怎么来实现呢?网上查了好久,也没有什么太好的解决办法,希望哪位大侠给予指导一下。
比如:
1232131321<ctrl+z>
先谢谢了
作者: dreamice    时间: 2008-11-25 17:46
稍微改一下上面的程序,应该就可以实现你的需求了
作者: kns1024wh    时间: 2008-11-25 19:50
标题: 回复 #1 fengyetang 的帖子
这个的 的ASCII码是26,你可以作为一个处理点
作者: dreamice    时间: 2008-11-25 20:43
原帖由 fengyetang 于 2008-11-25 17:46 发表
如题,我现在要向某个程序发送一串数据,其中包括"ctrl+z"的操作,要怎么来实现呢?网上查了好久,也没有什么太好的解决办法,希望哪位大侠给予指导一下。
比如:
1232131321
先谢谢了

ctlz.c

  1.   1 #include <signal.h>
  2.   2 #include <stdlib.h>
  3.   3 #include <stdio.h>
  4.   4
  5.   5 static void ctrl_z (int signal)
  6.   6 {
  7.   7         if (signal == SIGTSTP) {
  8.   8                 printf("got ctrl + z\n");
  9.   9         } else {
  10. 10                 printf("receive unresolved signal\n");
  11. 11         }
  12. 12 }
  13. 13
  14. 14 int main()
  15. 15 {
  16. 16         if (signal(SIGTSTP, ctrl_z) == SIG_ERR) {
  17. 17                 printf("can't catch SIGTSTP\n");
  18. 18                 return 0;
  19. 19         }
  20. 20         printf("register SIGTSTP success\n");
  21. 21         while (1) {
  22. 22                 pause();
  23. 23         }
  24. 24         return 0;
  25. 25 }
复制代码


# gcc ctlz.c -o ctlz
# ./ctlz
register SIGTSTP success
^Zgot ctrl + z

^Zgot ctrl + z
^Zgot ctrl + z
^Zgot ctrl + z
^Zgot ctrl + z
^C
作者: bitmilong    时间: 2008-11-25 20:56
dream 兄真是快呀,呵呵
作者: dreamice    时间: 2008-11-25 21:12
原帖由 bitmilong 于 2008-11-25 20:56 发表
dream 兄真是快呀,呵呵

支持bitmilong兄的版面呀
作者: dreamice    时间: 2008-11-25 21:52
改进版的,接收标准输入传送的数据。可以参照改进:
  1 #include <signal.h>
  2 #include <stdlib.h>
  3 #include <stdio.h>
  4
  5 #define MAX_LEN 250
  6 char g_buf[MAX_LEN];
  7 static void ctrl_z (int signal)
  8 {
  9         if (signal == SIGTSTP) {
10                 printf("got ctrl + z\n");
11                 gets(g_buf);
12         } else {
13                 printf("receive unresolved signal\n");
14         }
15 }
16
17 int main()
18 {
19         if (signal(SIGTSTP, ctrl_z) == SIG_ERR) {
20                 printf("can't catch SIGTSTP\n");
21                 return 0;
22         }
23         printf("register SIGTSTP success\n");
24         while (1) {
25                 pause();
26                 printf("stdin: %s\n", g_buf);
27         }
28         return 0;
29 }

作者: fengyetang    时间: 2008-11-25 23:49
原帖由 dreamice 于 2008-11-25 21:52 发表
改进版的,接收标准输入传送的数据。可以参照改进:
  1 #include
  2 #include
  3 #include
  4
  5 #define MAX_LEN 250
  6 char g_buf[MAX_LEN];
  7 static void ctrl_z (int signal)
  8 {
...

多谢了。呵呵,大家都dream兄。。。
作者: dreamice    时间: 2008-11-26 09:02
原帖由 fengyetang 于 2008-11-25 23:49 发表

多谢了。呵呵,大家都dream兄。。。


呵呵,不必客气
作者: eveson    时间: 2008-11-26 09:15
幸福吧
作者: luning.gl    时间: 2008-11-26 17:46
标题: 我有个问题,请教一下,谢谢
你好,我刚学JAVA,挺菜的,刚才去API看了一下,看到public Signer这个类是Deprecated的,有一个叫java.security.KeyStore的,那这里的SIGNER类还是可以用的吗?
作者: banggou    时间: 2008-11-27 23:20
嘿嘿 学习学习
作者: believe_me    时间: 2008-11-28 11:17
学习了
作者: linuxIsPerfect    时间: 2008-11-28 12:04
very good
作者: lionlin    时间: 2008-12-01 10:22
谢谢Dream兄,受启发了
作者: shagpg2008    时间: 2008-12-03 09:55
在字符串后面接着 "\x1A"就可以了。如:
"12343443\x1A";
作者: ligyf    时间: 2008-12-03 14:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: daschina    时间: 2008-12-03 15:32
前面的代码 哪里和 ctrl + z  有关系啊?没看出来
作者: dreamice    时间: 2008-12-03 20:13
原帖由 daschina 于 2008-12-3 15:32 发表
前面的代码 哪里和 ctrl + z  有关系啊?没看出来


ctrl + z是发送了一个信号SIGSTOP给程序
作者: BLZer    时间: 2008-12-05 11:09
原帖由 dreamice 于 2008-12-3 20:13 发表


ctrl + z是发送了一个信号SIGSTOP给程序

明明是SIGTSTP
这是一个job control信号
作者: CMAX    时间: 2008-12-05 12:00
有点疑问,不是说信号处理函数中不能使用printf么?这里使用不会有问题么?
作者: dreamice    时间: 2008-12-05 12:01
原帖由 BLZer 于 2008-12-5 11:09 发表

明明是SIGTSTP
这是一个job control信号


呵呵,回复的时候,没有仔细查看,谢谢指出
作者: dreamice    时间: 2008-12-05 12:03
原帖由 CMAX 于 2008-12-5 12:00 发表
有点疑问,不是说信号处理函数中不能使用printf么?这里使用不会有问题么?


我前面说了,这只是一个参考实现,为了简便。不足之处希望大家指出。
不过,还请CMAX把为什么不能使用的道理拿来大家分享一下
作者: vdigital    时间: 2008-12-06 19:20
学习了,好贴
作者: gobbin    时间: 2008-12-20 20:15
学习了 ~~~~




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2