进程未使用信号灯为什么会停止?

我的一个进程运行一段时间就会停止,用pidin看显示其STATE为SEM,可是进程中压根就没有用信号灯呀,其实它做的工作很简单,就是一个死循环,sleep一段时间后将一些数据保存到文件中,值得注意的是还做了另外一件工作,将是文件写完后(一分钟一个文件)将其拷贝为另外一块硬盘的同名文件作为备份,我是这样做的,
char text[100];
sprintf(text.“cp %s %s”,file1,file2);
system(text);


其中file1和file2为文件名
难道这样做有问题吗?请xtang等各位高手帮助看一下。

用gdb,attach到你的进程,应该就可以看出来,它是从什么地方调用下来的。你就可以知道,你执行了哪一句才导致SEM的。

xtang,能讲的具体些吗?GDB我没怎么用过,怎么attach呢?

  1. 在编译、链接时加 -g
  2. 运行,等它SEM
  3. pidin,找出
  4. gdb
  5. 在gdb光标下,打 attach
  6. bt

xtang,按照您说的方法敲入bt后显示:
#0 0xb032a2ae in ?? ()
#1 0x08064165 in ?? ()
#2 0x0805bcc1 in ?? ()
#3 0x0805e3a9 in ?? ()
#4 0x08052613 in ?? ()
#5 0x0804e336 in ?? ()


可这能看出什么呢?

没有符号表,你编译链接时都加了-g了吗?

可以在gdb里试试 gdb#sym /<binary_name>

我加了-g选项了呀,顺便问一句,一般什么情况进程会出现STATUS为SEM呢?

sem_wait()

可是我的进程中没有用信号灯呀!

对,但猜测是你调的某一个函数使用信号灯。而由于你传进去的参数,正好导致它被锁…

只是猜测,所以具体要知道到底程序最后执行的是什么。

再问一个问题,现在当进程被锁住后,用KILL命令杀不掉进程,另外为了防止这种情况出现我想通过别的进程判断被锁进程的状态,如果长时间被锁就杀死它重起,现在我的监控进程可以得到被锁进程的pid,那么如何判断进程的状态为sem呢?

xtang,能够做到发现进程处于SEM状态并杀死它吗?

参考pidin的源码。http://cvs.qnx.com/cgi-bin/cvsweb.cgi/utils/p/pidin/

主要是pidin_proc.c中的fill_status()函数。