久综合色-久综合网-玖草影视-玖草资源在线-亚洲黄色片子-亚洲黄色片在线观看

Hello! 歡迎來到小浪云!


UNIX 下奇怪的事情


avatar
小浪云 2025-02-17 68

最近在使用自編工具處理 unix 系統任務時,遇到了兩個意料之外的情況,并非程序錯誤,而是行為超出了預期。

UNIX 下奇怪的事情

線程安全 printf 函數

我編寫了一個 C 程序,用于讀取磁盤上的圖像,進行處理,并將結果輸出到標準輸出 (STDOUT)。簡化后的代碼如下:

for (imagefilename in images) {     results = process(imagefilename);     printf(results); }

圖像處理相互獨立,因此我嘗試使用 fork() 將處理任務分配到多個 CPU 內核以提高速度:

for (child in children) {     pipe = create_pipe();     worker(pipe); } // 父進程 for (imagefilename in images) {     write(pipe[i_image % N_children], imagefilename); } worker() {     while (1) {         imagefilename = read(pipe);         results = process(imagefilename);         printf(results);     } }

我創建管道進行進程間通信 (IPC),將文件名發送給子進程 worker。每個 worker 直接寫入共享的 STDOUT,導致輸出混亂。 flockfile() 函數無法解決問題,因為它受寫時復制機制的影響,每個子進程都擁有鎖的副本。

我最終選擇使用線程而非 fork() 來解決此問題,避免了復雜的管道操作。 代碼如下:

for (children) {     pthread_create(worker, child_index); } for (children) {     pthread_join(child); } worker(child_index) {     for (i_image = child_index; i_image < ... ) {         // ...     } }

這種方法更簡潔有效??磥?,某些情況下線程比進程更適用。

將部分讀取的文件傳遞給子進程

對于某些 vnlog 工具,我需要實現以下操作序列:

  1. 進程打開一個未設置 O_CLOEXEC 標志的文件。
  2. 進程讀取文件的一部分(例如,vnlog 中的圖例結尾)。
  3. 進程調用 exec() 執行另一個程序處理已打開文件的剩余部分。

第二個程序可能需要文件名而非文件描述符作為命令行參數,因為它可能自行調用 open()。傳遞文件名會導致重新打開文件并從頭開始讀取,這無法滿足需求。

我嘗試使用 /dev/fd/N 傳遞文件描述符,但它在 Linux 系統上表現得像符號鏈接,與傳遞文件名效果相同。

解決方法是使用管道而非文件。/dev/fd/N 在管道上能正確傳遞文件描述符。 這可以通過將 open(“filename”) 替換為 popen(“cat filename”) 來實現,但這并非理想解決方案。 這在 BSD 系統上的表現可能有所不同。

相關閱讀

主站蜘蛛池模板: 日本天堂网 | 欧美日韩精品国产一区二区 | 免费精品国产日韩热久久 | 中文字幕一区在线播放 | 午夜国产精品久久久久 | 欧美成人a人片 | 日韩a无吗一区二区三区 | 久久无码精品一区二区三区 | 九九精品在线视频 | 国产欧美一区二区三区久久 | 5x社区直接进入一区二区三区 | 美女视频很黄很a免费国产 美女视频黄.免费网址 | 日本欧美不卡一区二区三区在线 | 一级一片免费播放 | 操12p | 国产亚洲欧美精品久久久 | 69福利网| 久久毛片免费 | 特黄特黄| 亚洲人妖女同在线播放 | 久久99国产亚洲高清观看首页 | 国产成人免费不卡在线观看 | 免费大片黄手机在线观看 | 久久aa毛片免费播放嗯啊 | 国产日本欧美在线观看 | 成人精品免费网站 | 国产精品手机在线亚洲 | 欧美一二三区在线 | 中文字幕有码在线 | 日本理论片免费高清影视在线观看 | 美女被免费网站在线视频软件 | 成人韩免费网站 | 欧美成人高清性色生活 | 国产精品久久久久影院色老大 | 精品久久久久久综合网 | 欧美日韩一区二区三区视频播 | 在线成人毛片 | 国产精品男人的天堂 | 国产在线欧美日韩一区二区 | 香蕉久久精品国产 | 国产成人久久精品激情91 |