我在 perl 中運行了一個 while(1) 回圈以從 PostgreSQL 表中提取電子郵件地址和每個人的配置值。現在,我寫了一個臨時檔案并在 system.conf 中使用 neomutt -nF the_temp_file。然后我取消鏈接檔案。尼奧穆特辭職了。然后回圈為我提供電子郵件地址串列,以便使用我選擇的任何一個地址再次啟動 neomutt。
我還沒有在 neomutt 郵件串列上問過這個問題,但我會的。我想知道是否有一種方法可以在不將臨時檔案寫入檔案系統的情況下模擬臨時檔案。
更清楚一點:
獲取配置值,例如:
set beep = 0
set beep_new = 0
set bounce = ask-yes
set check_mbox_size = 1
set check_new = 1
并將其直接發送到現場 neomutt 期望在 neomutt -F config_file 中有一個檔案
這可能嗎?謝謝
uj5u.com熱心網友回復:
它仍然涉及一個臨時檔案,但是如果您使用的是具有/dev/fd檔案系統的Linux 等作業系統,您可以打開一個臨時檔案,立即將其洗掉以保持整潔,并將/dev/fd/N檔案名傳遞給neomutt,其中 N 是底層檔案perl 檔案句柄的描述符編號。如果您使用核心File::Temp模塊創建臨時檔案,則可以安全地完成,而不會出現潛在的競爭條件或必須手動洗掉檔案。
system但是,在執行子程式之前阻止描述符被關閉有一些苦差事。
例子:
#!/usr/bin/env perl
use strict;
use warnings;
use File::Temp qw/tempfile/;
use Fcntl qw/:DEFAULT/;
# Get a handle to an anonymous temporary file
my $fh = tempfile;
print $fh <<EOF;
set beep = 0
set beep_new = 0
set bounce = ask-yes
set check_mbox_size = 1
set check_new = 1
EOF
flush $fh;
# Clear the CLOEXEC bit so the descriptor is available to the program run
# by system
my $flags = fcntl $fh, F_GETFD, 0
or die "Unable to get descriptor flags: $!";
fcntl $fh, F_SETFD, $flags & ~FD_CLOEXEC
or die "Unable to set descriptor flags: $!";
my $fd = fileno $fh;
system("cat", "/dev/fd/$fd");
完全避免臨時檔案(但有點復雜)的另一種方法是打開一個管道,并分叉一個將資料寫入其中的孩子,并再次使用/dev/fd/N帶有 neomutt的介面:
#!/usr/bin/env perl
use strict;
use warnings;
use Fcntl qw/:DEFAULT/;
pipe my $reader, my $writer or die "Unable to pipe: $!\n";
my $pid = fork;
die "Unable to fork" unless defined $pid;
if ($pid == 0) { # Child process
close $reader;
print $writer <<EOF;
set beep = 0
set beep_new = 0
set bounce = ask-yes
set check_mbox_size = 1
set check_new = 1
EOF
close $writer;
exit;
} else { # Parent process
close $writer;
# Clear the CLOEXEC bit so the descriptor is available to the program run
# by system
my $flags = fcntl $reader, F_GETFD, 0;
fcntl $reader, F_SETFD, $flags & ~FD_CLOEXEC;
my $fd = fileno $reader;
system("cat", "/dev/fd/$fd");
close $reader;
waitpid $pid, 0; # Reap the child process
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/329323.html
標籤:PostgreSQL 文件 perl 纽穆特
