คำถามของคุณดูเหมือนจะเรียกคำตอบของฟอเรสต์และคำตอบที่นี่ดูเหมือนกับคำตอบของต้นไม้ดังนั้นฉันคิดว่าฉันจะให้คำตอบกับฟอเรสต์ให้คุณ
นี่เป็นสิ่งที่ไม่ค่อยเขียนโปรแกรม C เป็นวิธีที่เชลล์สคริปต์จะเขียนเสมอและบางครั้งวิธีเขียนโปรแกรม Python, perl หรือ Ruby
โดยทั่วไปผู้คนเขียนด้วยภาษา C เพื่อให้ง่ายต่อการใช้งานไลบรารี่ของระบบและการเข้าถึงการเรียกใช้ระบบปฏิบัติการระดับต่ำและความเร็ว และ C เป็นภาษาที่ยากต่อการเขียนดังนั้นหากผู้คนไม่ต้องการสิ่งเหล่านั้นพวกเขาก็ไม่ได้ใช้ C. โดยทั่วไปแล้วโปรแกรม C นั้นคาดว่าจะมีการพึ่งพาไลบรารีที่ใช้ร่วมกันและไฟล์กำหนดค่าเท่านั้น
การปอกเปลือกออกไปยังกระบวนการย่อยนั้นไม่รวดเร็วเป็นพิเศษและไม่จำเป็นต้องมีการเข้าถึงอย่างละเอียดและควบคุมสิ่งอำนวยความสะดวกของระบบระดับต่ำ ในโปรแกรม C
มีข้อกังวลเพิ่มเติมอยู่บ้าง ความปลอดภัยและการพกพาที่ผู้คนพูดถึงนั้นมีความสมบูรณ์ แน่นอนว่ามันใช้ได้กับเชลล์สคริปต์แน่นอน แต่ผู้คนคาดหวังว่าปัญหาเหล่านั้นในเชลล์สคริปต์ แต่โดยทั่วไปโปรแกรม C มักไม่ได้รับการคาดหวังว่าจะมีความกังวลด้านความปลอดภัยระดับนี้ซึ่งทำให้เป็นอันตรายมากขึ้น
แต่ในความคิดของฉันความกังวลที่ใหญ่ที่สุดเกี่ยวกับวิธีที่popen
จะโต้ตอบกับส่วนที่เหลือของโปรแกรมของคุณ popen
ต้องสร้างกระบวนการลูกอ่านเอาต์พุตและรวบรวมสถานะทางออก ในระหว่างนี้ stderr ของกระบวนการนั้นจะเชื่อมต่อกับ stderr เดียวกันกับโปรแกรมของคุณซึ่งอาจทำให้เกิดผลลัพธ์ที่สับสนและ stdin นั้นจะเหมือนกับโปรแกรมของคุณซึ่งอาจทำให้เกิดปัญหาที่น่าสนใจอื่น ๆ คุณสามารถแก้ไขได้โดยรวม</dev/null 2>/dev/null
ไว้ในสตริงที่คุณส่งผ่านpopen
เนื่องจากเชลล์ตีความโดย
และpopen
สร้างกระบวนการลูก หากคุณทำอะไรกับการจัดการสัญญาณหรือฟอร์กกระบวนการด้วยตัวคุณเองคุณอาจได้รับSIGCHLD
สัญญาณแปลก ๆ การโทรติดต่อของคุณwait
อาจมีปฏิกิริยาแปลก ๆpopen
และอาจทำให้เกิดสภาพการแข่งขันที่แปลกประหลาด
แน่นอนเรื่องความปลอดภัยและการพกพานั้นแน่นอน เนื่องจากมันใช้สำหรับเชลล์สคริปต์หรือสิ่งใดก็ตามที่เริ่มต้นการทำงานอื่น ๆ บนระบบ และคุณจะต้องระมัดระวังว่าคนที่ใช้โปรแกรมของคุณจะไม่สามารถที่จะได้รับเปลือก meta-charcaters เป็นสตริงที่คุณผ่านเข้าไปpopen
เพราะสตริงที่ให้ไปด้วยsh
sh -c <string from popen as a single argument>
แต่ผมไม่คิดว่าพวกเขาว่าทำไมมันดูแปลก ๆ โปรแกรม C popen
ใช้ เหตุผลที่แปลกคือเพราะ C เป็นภาษาระดับต่ำและpopen
ไม่ใช่ระดับต่ำ และเนื่องจากการใช้popen
ข้อ จำกัด การออกแบบสถานที่ในโปรแกรมของคุณเพราะมันจะมีปฏิสัมพันธ์กับอินพุตและเอาต์พุตมาตรฐานของโปรแกรมและทำให้การจัดการกระบวนการหรือการจัดการสัญญาณของคุณเป็นเรื่องลำบาก และเนื่องจากโดยทั่วไปแล้วโปรแกรม C มักไม่ได้คาดหวังว่าจะต้องพึ่งพาโปรแกรมภายนอก