Nó nên bị treo cậu ạ @@
Trong code của cậu, cậu không spawn bất cứ thread hay subprocess nào để thực thi. Lệnh system của cậu sẽ khiến cho chương trình C của cậu bị hang cho tới khi câu lệnh bên kia được thực hiện thành công. Vì cậu nói đó là câu lệnh nhận add flow, tớ nghĩ câu lệnh đó tốn thời gian thực hiện, và khiến cho chương trình của cậu bị hang sau đó.
Ngoài ra, common implementation của 1 phần mềm có “add flow” như ovs là lưu dữ liệu đó vào file. Rất dễ để cậu gặp vấn đề khi sử dụng 2 process mở và ghi vào chung 1 file config. Đó có thể là nguyên nhân khiến process bị hang (đây là phán đoán thôi nha, cậu cần đọc code để hiểu chính xác hơn).
Thử thêm &
đằng sau command của cậu như này xem:
snprintf(bar1, sizeof(bar1), "ovs-ofctl add-flow s1 priority=5,tcp,in_port=\"%s\",eth_src=%s,eth_dst=%s, ipv4_src=%s,ipv4_dst=%s,tcp_src=%u,tcp_dst=%u,action=output:\"%s\" &"
,in ,sMAC ,dMAC, sIP, dIP, sPort, dPort, out); // pass agr to cmd
Thêm &
sẽ làm cho câu lệnh kia được thực hiện ở background. Tất nhiên, cậu sẽ cần bỏ đoạn in log ra, và gộp nó vào câu lệnh mà cậu muốn gọi từ hàm system kia.
Và đồng thời, tớ recommend cậu tìm hiểu kỹ add flow ở script ovsctl làm gì. Thử đọc script hay đoạn code đó, vì có khả năng cậu đang sửa code để gọi tới 1 script, mà script đó gọi lại một hàm trong code cậu đang sửa. Điều này khiến việc gọi system trở nên thừa thãi (gọi system như cậu đang làm không phải cách tiêu chuẩn, hay nói cách khác, cậu đang hack để làm điều cậu muốn).
Nếu vẫn gặp vấn đề, cậu nên chuẩn bị minimal reproducible example. Nó sẽ giúp mọi người điều tra vấn đề của cậu nhanh hơn.