2015-03-02 9 views
0

我想在用C编写的程序中运行系统函数。 此系统函数处于阻塞状态,可能需要一些时间才能返回到stdout。被调用的功能是喷鼻息,并且通常作为随后在覆盆子PI执行:执行系统函数并解析输出

sudo snort -q -A console -i eth0 -c /etc/snort/snort.conf 

在这种情况下鼻息触发警报,父程序应该读取该行并点亮LED。我目前正在开启LED如下:

void triggerLed(void) { 
    pinMode(7], OUTPUT); 
    digitalWrite(7, HIGH); 
} 

int main(void) { 
    //Execute this function call: sudo snort -q -A console -i eth0 -c /etc/snort/snort.conf 

    //while executing 
     //On new line from readline() 
      //if strcmp(line,"alert") 
       triggerLed(); 
      //endif 
//end while 

} 

你会如何解决这个问题?我试着监视系统日志,但是snort并没有写入系统日志,因为我找不到任何警报。

fyi:上周我问了这个问题:Execute script on Snort alert。不幸的是,由于模糊的问题和范围的变化,我在这里重新提出了这个问题。

回答

0

您正在查找的功能是系统(3)。您将返回过程的退出代码。 但是,如果您打算读取被调用进程的输出(stdout),则必须实现fork(3)/ exec(3)组合,重新连接子进程的文件描述符(至少fd 1)并从中读取。

+0

问题是函数不输出EOL或EOF,因此STDOUT被缓存,直到它在STDIN能够读取它之前接收到该字符。 – 2015-03-04 11:28:55

+0

只要有EOL('\ n'),stdout就会被刷新。 EOF不是一个字符。在这种情况下,通过读(2)检测到返回0。 – Bernhard 2015-03-06 07:09:16