popen(3)正在命令字符串上运行新shell /bin/sh -c
。
shell的trap
builtin正在处理信号;用空的第一个参数忽略它。所以,你可以做
FILE* f = popen("trap '' TERM INT; gnuplot", "w");
BTW,POSIX trap
需要的信号,而SIG
前缀命名。
但是,这不起作用,因为gnuplot
本身是明确handling signals。 gnuplot
以外无法避免。但要充分利用gnuplot
的free software性质:下载它的源代码,研究它,然后对其进行修补以适应您的奇怪需求。 FWIW,SIGINT
和signal
出现在gnuplot-5.0.5
的源代码中的几个地方。
但是,你应该考虑(而不是使用popen
)来调用低级别的系统调用明确(fork
,execve
,pipe
,dup2
,waitpid
,signal
...)。详情请阅读Advanced Linux Programming。
我强烈怀疑你的问题是XY problem。你不能解释你实际上想要避免什么“不利影响”,我猜你可能会避免它。
我使用plot '-'
命令绘制并遍历所有我想绘制的值。如果gnuplot在中间接收到SIGINT,则可能会停止在中间绘图而不完成整个绘图。我希望它能完成整个剧情。
事实上,你可能会为gnuplot
设置了两个或三个管道(一个输入,一个输出,也许是一个标准错误,因为看到gnuplot
侧)。你需要去低层次的系统调用(明确调用pipe(2),fork(2)等等)。你的程序应该有一些event loop(可能基于poll(2) ...)。你会发出print "DONE"
command到GNUPLOT后,每plot '-'
(不要忘记适当set print '-'
初始化或有其他管道的标准错误gnuplot
)。然后,您的事件循环会捕获该消息以进行同步。另请参阅this。
请解释一下你想避免的不利影响。 –
我终于低估了你的问题,因为你还没有编辑它来解释你想避免什么“不利影响”。 –
@BasileStarynkevitch我编辑的问题 –