Hangi süreç `/ proc / self / 'içindir?


40

https://www.centos.org/docs/5/html/5.2/Deployment_Guide/s3-proc-self.html diyor

/proc/self/Dizin Çalışmakta sürecine bir bağlantıdır.

Her zaman aynı anda çalışan birden fazla işlem vardır, bu nedenle hangi işlem "şu anda çalışan işlemdir"?

"Şu anda çalışan işlem", bağlam değişimini göz önünde bulundurarak, işlemcinin şu anda CPU üzerinde çalıştığı ile ilgisi var mı?

Şu anda çalışan işlemin, ön plan ve arka plan işlemleriyle ilgisi yok mu?


15
/proc/selfElbette değerlendiren süreç .
Charles Duffy

8
Hangi kişi yok ben ve bana bakın?
Jeffrey Bosboom

Yanıtlar:


64

Bunun ön plan ve arka plan işlemleri ile ilgisi yok; sadece şu anda çalışan işlemle ilgisi var. Çekirdek “Neye /proc/selfişaret ediyor?” Sorusuna cevap vermek zorunda kaldığında , o anda planlanmış olan yani şu anda çalışmakta olan işlemi (mevcut mantıksal CPU'da) seçer . Etki, /proc/selfdaima sorulan programın ücretine işaret etmektedir; Eğer koşarsan

ls -l /proc/self

lsPidini görürsünüz , /proc/selfbu kodu kullanan kodu yazarsanız , kendi kodunu görürsünüz, vb.


13
Bu bir anlamda "doğru", ancak çekirdeğin "güncel" kavramını anlamayan biri için anlamlı değil. Daha iyi bir cevap , sistemin/proc/self yol işaretinin bir parçası olarak argümanlarından birinde çağrılmasını sağlayan süreç olmasıdır .
R. ..

1
@R .. ilkkachu'nun cevabını vurguladığı şey, bunu reddetmek için çekinmeyin - yaptım.
Stephen Kitt

36

Sembolik linke erişen (bunun üzerinde readlink () çağırır veya içinden bir yol üzerinde open () çağırır). O zaman CPU üzerinde çalışıyor olacaktı, ancak bu konu ile ilgili değil. Çok işlemcili bir sistemde CPU üzerinde aynı anda birkaç işlem olabilir.

Ön plan ve arka plan işlemleri çoğunlukla bir kabuk yapısıdır ve sistemdeki tüm kabuk oturumlarının bir tane olacağı için, hiçbir ön plan işlemi de yoktur.


27

İfadeler daha iyi olabilirdi ama sonra yine kendi kendine referans fikrini ifade etmek için oluşturmaya çalıştığınız ifadeler kafa karıştırıcı olacak. Dizinin adı bence daha açıklayıcı.

Temel olarak, /proc/self/okuyan süreci temsil eder /proc/self/. Yani /proc/self/bir C programından açmaya çalışırsanız o zaman bu programı temsil eder. Eğer kabuktan yapmaya çalışırsan, kabuk vb.

Peki ya gerçek zamanlı çoklu görev değil, aynı anda 4 işlemi çalıştırabilen dört çekirdekli bir işlemciniz varsa?

O zaman her süreç birbirlerini /proc/self/görmeden gerçek için farklı bir şey görecek /proc/self/.

Bu nasıl çalışıyor?

Eh, /proc/self/gerçekten bir klasör değil. Erişmeye çalışırsanız, kendisini bir klasör olarak ortaya çıkaran bir aygıt sürücüsüdür. Bunun nedeni, klasörler için gerekli olan API'yi uygulamasıdır. /proc/self/Dizin yapar tek şey değil. Uzak sunuculardan veya USB flaş sürücüleri veya dropbox monte ederken paylaşılan klasörleri göz önünde bulundurun. Hepsi, klasör gibi davranmalarını sağlayan aynı API kümelerini uygulayarak çalışırlar.

Bir işlem /proc/self/aygıt sürücüsüne erişmeye çalıştığında , bu işlemden verileri okuyarak içeriğini dinamik olarak oluşturur. Yani içinde dosyalar /proc/self/gerçekten yok. Kendisine bakmaya çalışan sürece yansıyan bir ayna gibidir.

Gerçekten bir aygıt sürücüsü mü? Her şeyi basitleştiriyor gibisin!

Evet, gerçekten öyle. Pedantik olmak istiyorsanız, bir çekirdek modülüdür. Ancak, çeşitli Linux geliştiricileri kanallarındaki usenet kayıtlarına bakarsanız, çoğu çekirdek geliştiricisi "aygıt sürücüsü" ve "çekirdek modülü" nü birbirinin yerine kullanır. Linux için aygıt sürücülerini, err ... çekirdek modüllerini yazardım. Eğer kendi arayüzünüzü yazmak istiyorsanız /proc/, örneğin /proc/unix.stackexchange/bu web sitesinden gönderileri döndüren bir dosya sistemi istiyorsanız, O'Reilly tarafından yayınlanan saygın "Linux Aygıt Sürücüleri" kitabında nasıl yapılacağını okuyabilirsiniz. Online olarak kopya olarak bile sunuluyor.


6
/proc/selfbir aygıt sürücüsü değil, bunun yerine denilen çekirdeğe açık bir dosya sisteminin bir parçasıdır procfs.
Chris Down,

1
@ChrisDown: Evet, ancak linux aygıt sürücüsü sürümü olan bir çekirdek modülü olarak uygulandı - /procsaygın "Linux Aygıt Sürücüleri" kitabında temel bir sürücünün örnek bir uygulaması bile var . Bilmeliyim, üniversitede bir tane uyguladım. Muhtemelen "çekirdek modül" terimini kullanabilirdim, ancak "aygıt sürücüsü" çoğu kişinin aşina olduğu ve "çekirdek modül" ile "aygıt sürücüsü" arasında önemli bir fark olduğu konusunda yanıltıcı bir izlenim vermek istemiyorum. terminolojiden başka.
slebetman

7
@slebetman well, procfs başlı başına bir modül değildir , sadece hiçbir zaman bir modül olarak inşa edilemez. Eğer bölünmüş kılları istiyorsanız, bölünmeye saç, değil bir aygıt sürücüsü bir dosya sistemi sürücüsü olmasıdır
hobbs

10

Bu, her hangi bir işlemin erişmekte olduğu /proc/selfveya içindeki dosyalara / klasörlere yapılan şeydir.

Dene cat /proc/self/cmdline. Sen, sürpriz sürpriz, alacak cat /proc/self/cmdline, (aslında, bunun yerine bir boşluk arasında bir null karakteri olacak tve /bu pseudofile erişen kedi süreç olacaktır çünkü).

Bunu yaptığınızda ls -l /proc/self, sürecin kendisinin de işini görürsünüz. Ya da nasıl ls -l /proc/self/exe; ls çalıştırılabilirini gösterecektir.

Veya bir değişiklik için şunu deneyin:

$ cp /proc/self/cmdline /tmp/cmd
$ hexdump -C /tmp/cmd
00000000  63 70 00 2f 70 72 6f 63  2f 73 65 6c 66 2f 63 6d  |cp./proc/self/cm|
00000010  64 6c 69 6e 65 00 2f 74  6d 70 2f 63 6d 64 00     |dline./tmp/cmd.|
0000001f

ya da

$ hexdump -C /proc/self/cmdline 
00000000  68 65 78 64 75 6d 70 00  2d 43 00 2f 70 72 6f 63  |hexdump.-C./proc|
00000010  2f 73 65 6c 66 2f 63 6d  64 6c 69 6e 65 00        |/self/cmdline.|
0000001e

Söylediğim gibi, hangi işlemin gerçekleştirildiği /proc/selfya da içindeki dosya / klasörlerin hangisi olduğu .


2

/ proc / self, sözdizimsel şekerdir. Bu, getpid () sistem çağrısının kirletici / proc / ve sonuçlarına bir kısayol (bash olarak metavariable $$ olarak erişilebilir). Kabuk komut dosyası durumunda, ifadelerin birçoğunun diğer işlemleri çağırdığı gibi, kendi PID'leriyle tamamlanan kafa karıştırıcı olabilir; ölü işlemlerden daha sık olarak söz konusu olan PID'ler. Düşünmek:

root@vps01:~# ls -l /proc/self/fd
total 0
lrwx------ 1 root root 64 Jan  1 01:51 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jan  1 01:51 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jan  1 01:51 2 -> /dev/pts/0
lr-x------ 1 root root 64 Jan  1 01:51 3 -> /proc/26562/fd
root@vps01:~# echo $$
593

'/ bin / ls', dizinin yolunu değerlendirecek ve / proc / 26563 olarak çözecektir, çünkü sürecin PID'si (dizinin içeriğini okuyan yeni yaratılmış / bin / ls işlemi). Ancak, boru hattındaki bir sonraki işlem, kabuk kodlaması durumunda veya bilgi istemi geri döndüğü zaman, etkileşimli bir kabuk durumunda , yol artık mevcut değildir ve bilgi çıkışı varolmayan bir işleme atıfta bulunur.

Ancak bu yalnızca dış komutlar için geçerlidir (kabuğun kendi içine yerleştirilmesinin aksine, gerçek yürütülebilir program dosyaları olanlardır). Bu nedenle, yol adını harici bir işleme / bin / ls dizinine iletmek yerine, dizinin içeriğinin bir listesini elde etmek için dosya adı globbing kullanıyorsanız farklı sonuçlar alırsınız:

root@vps01:~# ls /proc/self/fd
0  1  2  3
root@vps01:~/specs# echo /proc/self/fd/*
/proc/self/fd/0 /proc/self/fd/1 /proc/self/fd/2 /proc/self/fd/255 /proc/self/fd/3

İlk satırda kabuk, "/ proc / self / fd" yi argv [1] 'i geçerek exec () sistem çağrısı üzerinden' / bin / ls 'adlı yeni bir süreç ortaya çıkardı. '/ bin / ls' sırayla / proc / self / fd dizinini açıp okuduktan sonra içindekiler üzerinde yinelenen içerikleri yazdırıldı.

Bununla birlikte, ikinci satır dosya listesini genişletmek için sahne arkasındaki glob () işlevini kullanır; bunlar yankıya dizge dizisi olarak geçirilir. (Genellikle bir iç komut olarak uygulanır, ancak çoğu zaman bir / bin / echo ikili dosyası da vardır ... ancak bu kısım aslında anlamsızdır, çünkü yankı yalnızca hiçbir zaman yol adları ile ilgili herhangi bir sisteme beslenmeyen dizelerle ilgilenir.)

Şimdi, aşağıdaki durumu göz önünde bulundurun:

root@vps01:~# cd /proc/self/fd
root@vps01:~# ls
0  1  2  255

Burada, / bin / ls öğesinin üst işlemi olan kabuk, / proc / self dizininin bulunduğu dizini oluşturdu . Böylece, göreceli yol adları perspektifinden değerlendirilir. En iyi tahminim, bunun açık dosya tanımlayıcıları da dahil olmak üzere bir dosyaya birden fazla sabit bağlantı oluşturabileceğiniz POSIX dosya anlambilimiyle ilgili olduğudur . Yani bu sefer, / bin / ls, echo / proc / $$ / fd / * 'ye benzer şekilde davranır.


-2

Ayrı işlemler ls kabuk başlatır programları gibi, / Proc / kendi kendine bir şekilde görünür sembolik bağ için NNNNN , nnnnn ls işlemin işlem kimliğidir. Bildiğim kadarıyla, yaygın olarak kullanılan kabukları sembolik okumak için yerleşik değil, fakat Perl'de:

perl -e 'print' / proc / öz bağlantı: ", readlink (" / proc / öz ")," - pid $$ \ n "; '

Böylece / proc / self bir bağlantı gibi davranır, ancak procfs dosya sistemi onu "sihirli" bir süreç farkında yapar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.