คำถามติดแท็ก system-calls

คำถามเกี่ยวกับรายละเอียดว่าโปรแกรมใช้การเรียกของระบบเพื่อโต้ตอบกับเคอร์เนล API, การโทรใดที่พร้อมใช้งาน, วิธีการทำงาน ฯลฯ

6
อะไรคือความแตกต่างระหว่างการเรียกใช้ไลบรารีและการโทรของระบบใน Linux
ฉันอยากจะรู้ว่าอะไรคือความแตกต่างระหว่างการโทรในห้องสมุดและการโทรของระบบใน Linux พอยน์เตอร์ใด ๆ สำหรับความเข้าใจที่ดีของแนวคิดที่อยู่เบื้องหลังทั้งสองจะได้รับการชื่นชมอย่างมาก

2
ความแตกต่างระหว่าง fork () และ vfork () คืออะไร
ฉันต้องการที่จะเข้าใจในรายละเอียดความแตกต่างระหว่าง fork () และ vfork () ฉันไม่สามารถแยกแยะหน้าคนได้อย่างสมบูรณ์ ฉันต้องการชี้แจงเพื่อนร่วมงานคนหนึ่งให้ความเห็นว่า " ใน Linux ปัจจุบันไม่มี vfork () แม้ว่าคุณจะเรียกมันว่ามันจะเรียกส้อมภายใน () "

2
เทียบเท่ากับ "truss -T" และ "truss -U" บน Linux หรือไม่
มีเทียบเท่าของสิ่งที่-Tและ-Uตัวเลือกของtrussยูทิลิตี้ Solaris ไม่เกี่ยวกับลินุกซ์ สิ่งเหล่านี้คือการระบุการเรียกของระบบ ( -T) หรือฟังก์ชั่นห้องสมุด ( -U) ซึ่งเมื่อเรียกใช้โดยแอปพลิเคชันที่ติดตามจะทำให้เกิดการหยุด หรือกล่าวเป็นอย่างอื่นฉันต้องการให้กระบวนการใด ๆ ที่เริ่มต้นโดยแอปพลิเคชันที่ติดตามแล้วหยุดทำงาน (ราวกับถูกฆ่าโดย SIGSTOP) ทันทีที่ทำการเรียกระบบหรือการเรียกฟังก์ชั่นไลบรารีที่แชร์ straceและltraceบน Linux นั้นมีชุดฟีเจอร์มากมายของ Solaris trussแต่พวกเขาดูเหมือนจะไม่ทำเช่นนั้น ตัวอย่างเช่น truss -f -T open cmd จะเป็นเช่นstrace -f cmdนั้นยกเว้นว่าหากกระบวนการที่ดำเนินการcmdหรือลูกหลานของมันopenเรียกระบบใด ๆมันจะหยุดทันที (และฉันสามารถดำเนินการต่อในภายหลังได้ตามความสะดวกของฉัน) ในบางกรณีฉันสามารถใช้งานgdbได้catch syscallแต่ฉันกำลังมองหาวิธีแก้ปัญหาที่สามารถติดตามส้อมได้อย่างสะดวกและดำเนินการต่อสำหรับกระบวนการทางแยกทั้งหมดและทำexecveต่อไปเรื่อย ๆ ดูเหมือนว่าฉันจะเรียกคืนยูทิลิตี้บางอย่างที่ให้ฟังก์ชั่นเดียวกันแม้แต่หนึ่ง (หรือตัวเลือกสำหรับยูทิลิตี้เดียวกันนั้น) ไปยังแอปพลิเคชันขั้นตอนเดียวระหว่างบางเหตุการณ์ของ syscall บางระยะไกลเช่นนั้น แต่หน่วยความจำของฉัน ที่อยู่บน Linux

4
ทำไมลูกของ vfork หรือ fork call _exit () แทนที่จะออก ()
จากหน้าคนของvfork(): vfork () แตกต่างจาก fork () ซึ่งผู้ปกครองจะถูกระงับจนกว่าเด็กจะเรียกร้องให้ execve (2) หรือ _exit (2) ชายด์แบ่งใช้หน่วยความจำทั้งหมดกับพาเรนต์รวมถึงสแต็กจนกว่า execve () จะออกโดยเด็ก เด็กต้องไม่ส่งคืนจากฟังก์ชันปัจจุบันหรือ call exit () แต่อาจเรียก _exit () ทำไมเด็กควรใช้_exit()มากกว่าเพียงแค่การเรียกร้องexit()? ฉันหวังว่านี้สามารถใช้ได้กับทั้งสองและvfork()fork()
12 c  system-calls  fork  exit 

2
เหตุใดจึงไม่มีการแทรกไฟล์ syscalls
เพื่อความเข้าใจของฉันสำหรับการจัดการไฟล์มีเพียง sys_write syscall ใน Linux ซึ่งจะเขียนทับเนื้อหาไฟล์ (หรือขยายถ้าในตอนท้าย) เหตุใดจึงไม่มี syscalls สำหรับการแทรกหรือลบเนื้อหาในไฟล์ใน Linux? เนื่องจากระบบไฟล์ปัจจุบันทั้งหมดไม่ต้องการให้ไฟล์เก็บไว้ในบล็อกหน่วยความจำต่อเนื่องจึงควรมีการใช้งานที่มีประสิทธิภาพ (ไฟล์จะได้รับการแยกส่วน) ด้วยคุณสมบัติของระบบไฟล์เช่น "คัดลอกเมื่อเขียน" หรือ "การบีบอัดไฟล์โปร่งใส" วิธีการแทรกเนื้อหาในปัจจุบันดูเหมือนจะไม่มีประสิทธิภาพมาก

2
การเพิ่มการเรียกระบบใหม่ไปยัง Linux 3.2.x ด้วยโมดูลเคอร์เนลที่โหลดได้ [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Unix & Linux Stack Exchange ปิดให้บริการใน7 ปีที่ผ่านมา ฉันต้องการเพิ่มการเรียกของระบบใหม่ใน linux kernel 3.2.x แต่เป็นโมดูลเคอร์เนลที่สามารถโหลดได้ (เพราะฉันไม่ต้องการคอมไพล์เคอร์เนลซ้ำแล้วซ้ำอีก) ฉันอ่านโพสต์มากมายบนอินเทอร์เน็ตและใน SO และบางแห่งอ้างว่าการใช้การเรียกระบบเนื่องจากโมดูลที่โหลดได้นั้นเป็นไปไม่ได้ในขณะที่คนอื่นบอกว่าเป็นไปได้ มันคืออะไร จะทำอย่างไรถ้าเป็นไปได้?

4
ความแตกต่างระหว่างการเรียกระบบและฟังก์ชั่นห้องสมุด
ฉันเคยผ่านคำตอบของคำถามนี้แต่ไม่เข้าใจความแตกต่างระหว่างการโทรของระบบและฟังก์ชั่นห้องสมุด ตามหลักการแล้วอะไรคือความแตกต่างระหว่างทั้งสอง

3
หน่วยเวลาที่ strace ใช้คืออะไรเมื่อแสดงเวลาที่ใช้ใน syscalls
เมื่อใช้คำสั่งstraceกับการตั้งค่าสถานะ-Tฉันต้องการที่จะรู้ว่าหน่วยเวลาที่ใช้ในการแสดงเวลาที่ใช้ใน syscalls คืออะไร? ฉันคิดว่ามันควรจะเป็นในไม่กี่วินาที แต่ฉันไม่แน่ใจและดูเหมือนว่าจะถูกตัดออกจากคู่มือ

1
การใช้“ อาถรรพณ์อาถรรพณ์” ในการเรียกระบบรีบูตระบบ Linux คืออะไร?
ขณะที่ผมกำลังอ่านรหัสที่มาลินุกซ์และอื่น ๆ โดยเฉพาะรหัสสายระบบผมมาในsys_rebootการดำเนินงาน: http://lxr.free-electrons.com/source/kernel/reboot.c#L199 199 SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, 200 void __user *, arg) 201 { 202 ... ... 286 } ตรงกลางมีโค้ดเฉพาะส่วนนี้: 209 210 /* For safety, we require "magic" arguments. */ 211 if (magic1 != LINUX_REBOOT_MAGIC1 || 212 (magic2 != LINUX_REBOOT_MAGIC2 && 213 magic2 != …

1
ทำไม rmdir และยกเลิกการเชื่อมโยงการเรียกระบบสองครั้งแยกกัน?
นี่คือสิ่งที่ทำให้ฉันสงสัยอยู่พักหนึ่ง: [15:40:50][/tmp]$ mkdir a [15:40:52][/tmp]$ strace rmdir a execve("/usr/bin/rmdir", ["rmdir", "a"], [/* 78 vars */]) = 0 brk(0) = 0x11bb000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff3772c3000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=245801, ...}) = 0 mmap(NULL, 245801, …

4
เมื่อใดที่จะเรียก fork () และ exec () ด้วยตัวเอง?
ฉันเรียนรู้เกี่ยวกับคำสั่ง fork () และ exec () ดูเหมือนว่า fork () และ exec () มักจะถูกเรียกเข้าด้วยกัน (fork () สร้างกระบวนการลูกใหม่และ exec () แทนที่อิมเมจกระบวนการปัจจุบันด้วยอันใหม่) อย่างไรก็ตามในสถานการณ์ใดที่คุณอาจเรียกแต่ละฟังก์ชั่นด้วยตัวเอง มีสถานการณ์แบบนี้เหรอ?

3
การเรียกของระบบรองรับการรันเคอร์เนล
มีวิธีรับจำนวนหรือรายการการโทรของระบบที่รองรับโดย Linux Kernel หรือไม่? ดังนั้นฉันต้องการหาวิธี 'อ่าน' ตาราง syscall ของเคอร์เนลที่กำลังทำงานอยู่

2
ไฟล์ใดในเคอร์เนลระบุ fork (), vfork () ... เพื่อใช้การเรียกระบบ sys_clone ()
เมื่อ ltrace ใช้สำหรับการติดตามการเรียกของระบบฉันเห็นว่า fork () ใช้ sys_clone () มากกว่า sys_fork () แต่ฉันไม่สามารถหาแหล่งที่มาของลินุกซ์ที่มีการกำหนดไว้ โปรแกรมของฉันคือ #include<stdio.h> main() { int pid,i=0,j=0; pid=fork(); if(pid==0) printf("\nI am child\n"); else printf("\nI am parent\n"); } และเอาท์พุท ltrace คือ SYS_brk(NULL) = 0x019d0000 SYS_access("/etc/ld.so.nohwcap", 00) = -2 SYS_mmap(0, 8192, 3, 34, 0xffffffff) = 0x7fe3cf84f000 SYS_access("/etc/ld.so.preload", 04) = -2 SYS_open("/etc/ld.so.cache", …

3
การทำให้กระบวนการอ่านไฟล์อื่นสำหรับชื่อไฟล์เดียวกัน
ฉันมีแอปพลิเคชั่นที่อ่านไฟล์ โทร Let 's มันProcessNameและแฟ้ม~ / .configuration เมื่อprocessnameรันมันจะอ่าน~ / .configurationเสมอและไม่สามารถกำหนดค่าต่างกันได้ นอกจากนี้ยังมีแอปพลิเคชันอื่น ๆ ที่ใช้ "~ / .configuration" ก่อนและหลัง แต่ไม่ใช่ในขณะที่ชื่อกระบวนการกำลังทำงาน การตัดชื่อกระบวนการในสคริปต์ที่แทนที่เนื้อหาของ~ / .configurationเป็นตัวเลือก แต่เมื่อเร็ว ๆ นี้ฉันมีไฟดับ (ในขณะที่เนื้อหาถูกสับเปลี่ยนออก) ซึ่งฉันได้สูญเสียเนื้อหาก่อนหน้าของไฟล์ดังกล่าวดังนั้นจึงไม่เป็นที่ต้องการ มีวิธี (อาจใช้บางสิ่งที่เกี่ยวข้องกับการห่างไกลLD_DEBUG=files processname?) เพื่อหลอกให้กระบวนการอ่านเนื้อหาต่าง ๆ เมื่อพยายามอ่านไฟล์ใดไฟล์หนึ่ง? การค้นหาและแทนที่ชื่อไฟล์ในไฟล์เรียกทำงานนั้นเป็นบิตที่รุกรานเกินไป แต่ก็ควรใช้งานได้เช่นกัน ฉันรู้ว่าเป็นไปได้ที่จะเขียนโมดูลเคอร์เนลที่รับopen()สาย ( https://news.ycombinator.com/item?id=2972958 ) แต่มีวิธีที่ง่ายขึ้นหรือสะอาดขึ้นหรือไม่ แก้ไข: เมื่อค้นหา~ / .configurationในProcessNameปฏิบัติการที่ผมค้นพบว่ามันพยายามที่จะอ่านชื่อไฟล์อื่นขวาก่อนอ่าน~ / .configuration แก้ไขปัญหา.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.