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

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 系統上的表現可能有所不同。

相關閱讀

主站蜘蛛池模板: 午夜在线亚洲男人午在线 | 欧美日韩精彩视频 | 九九热视频在线免费观看 | 国产com| 亚洲成人手机在线观看 | 免费观看一级特黄三大片视频 | 成人软件18免费 | 三级在线国产 | 国产免费黄色网址 | 精品国产一区二区三区不卡 | 亚洲午夜久久久久国产 | 欧美老头老太做爰xxxx | 国产精品久久久久a影院 | 99久久精品自在自看国产 | 99精品欧美一区二区三区美图 | 欧美野外性k8播放性迷宫 | 男人的天堂视频在线 | 中国女人毛片 | 女人张开腿让男人桶免费网站 | 国产成人无精品久久久 | 在线亚洲精品自拍 | 一级毛片中文字幕 | 日韩欧美在线观看一区 | 久爱午夜精品免费视频 | 日韩 欧美 中文 亚洲 高清 在线 | 国产一区二区三区日韩欧美 | 亚洲一区二区三区在线视频 | 国产成人精品免费视频大全五级 | 日韩一级片在线观看 | 五月色婷婷琪琪综合伊人 | 成人看片黄a在线看 | 国产三级久久 | 美国免费高清一级毛片 | 国产一在线精品一区在线观看 | 欧美一级棒 | 欧美一级一极性活片免费观看 | 国产高清一国产免费软件 | 韩日黄色片 | 九九色视频 | 毛片国产 | 日本免费人成在线网站 |