我有一个相对不重要的问题,关于可重复的代码(您可以直接从您的环境运行它
本质上
我有一些C和Python代码。
我的python代码
创建两个管道tomcat_1和tomcat_2,这两个管道可以分别读写。
现在我使用我的tomcat_2管道编写字符串F-14 TOMCAT,在我的C代码中,我打开两个管道,并从tomcat_2管道读取已经编写的内容
这东西没有任何戏剧性的工作。
import os
import signal
#Remove existing fifos if not cleaned up from last time.
try:
os.unlink('/tmp/tomcat_1')
os.unlink('/tmp/tomcat_2')
except FileNotFoundError:
pass
signal.signal(signal.SIGINT, lambda x,y: None) #Setup signal handler with no-op lambda expression
os.mkfifo('/tmp/tomcat_1') #Fifos can be constructed in python
os.mkfifo('/tmp/tomcat_2')
r = open('/tmp/tomcat_1','r')
w = open('/tmp/tomcat_2','w')
w.write("F-14 TOMCAT")
w.flush()
w.close()
with open('/tmp/tomcat_2', 'r') as f:
pid = int(f.read())
os.kill(pid, signal.SIGUSR1)
while True:
data = r.read()
if len(data) > 0:
print('PYTHON: Received ' + data) # FIFOs can be read from like any other file
# Close reading pipe
r.close()
signal.pause() #mimics pause(2)
print('PYTHON: ending process')
r.close()
#cleanup fifos
os.unlink('/tmp/tomcat_1')
os.unlink('/tmp/tomcat_2')
现在
我有C代码,可以读取写入管道的数据
void signal_handler(int SIG);
volatile sig_atomic_t g_sigint_flag = 0;
volatile sig_atomic_t g_sigusr1_flag = 0;
int fd1;
int fd2;
void exchange_signal_handler(int signo);
int main(int argc, char ** argv) {
char trader[100];
fd2 = open("/tmp/tomcat_1",O_WRONLY);
fd1 = open("/tmp/tomcat_2", O_RDONLY);
if (fd1== -1) {
perror("open pipe failed");
return 1;
}
if (fd2== -1) {
perror("open pipe failed");
return 1;
}
if (signal(SIGINT, signal_handler) == SIG_ERR) {
printf("Unable to register signal handler for SIGINT\n");
return 1;
}
if (signal(SIGUSR1, exchange_signal_handler) == SIG_ERR) {
printf("Unable to register exchange signal handler for SIGUSR1\n");
return 1;
}
char buf[1024];
int buf_size = read(fd1, buf, sizeof(buf));
buf[buf_size] ='\0';
printf("Received data: %s\n", buf);
while (!g_sigint_flag) {
if (g_sigusr1_flag) {
g_sigusr1_flag = 0; // Reset the flag
}
}
close(fd2);
close(fd1);
return 0;
}
void signal_handler(int SIG) {
if (SIG == SIGINT) {
printf("Terminated\n");
g_sigint_flag = 1;
}
}
void exchange_signal_handler(int signo) {
if (signo == SIGUSR1) {
printf("Received SIGUSR1 signal from exchange\n");
g_sigusr1_flag = 1;
}
}
现在我的问题是,当我的Python代码向tomcat_2管道发送SIGUSR 1信号时,在Python中,我的C代码应该检测到这一点并打印一个hello world
我该怎么做呢?
1条答案
按热度按时间j5fpnvbx1#
代码至少有这个问题。不知道这是否是OP问题的来源。
风险:写入缓冲区外
当读取
1024
字节时,代码写入缓冲区外。或