2012-09-26 25 views
16

tôi có vlc (chương trình để tái tạo video) nếu tôi gõ vào một vỏ:Làm thế nào để gọi execl() trong C với các đối số thích hợp?

/home/vlc "/ home/phim của tôi/bộ phim tôi muốn see.mkv"

nó mở ra tái tạo phim.

Tuy nhiên, khi tôi chạy chương trình sau:

#include <unistd.h> 

int main(void) { 

    execl("/home/vlc", "/home/my movies/the movie i want to see.mkv",NULL); 

    return 0; 
} 

vlc mở ra nhưng không tạo thêm bất cứ điều gì. Làm sao tôi có thể giải quyết việc này?

Những điều tôi đã cố gắng:

tôi đoán

execl("/home/vlc", "/home/my movies/the movie i want to see.mkv",NULL); 

tương đương với gõ vào vỏ:

/home/vlc /home/my movies/the movie i want to see.mkv 

mà không làm việc, vì vậy tôi đã cố gắng

execl("/home/vlc", "\"/home/my movies/the movie i want to see.mkv\"",NULL); 

và vlc o viết lên nhưng không tái sản xuất.

Thay vì viết NULL ở cuối, tôi đã thử 0, (char *) 0, 1 .... không hữu ích. Trợ giúp !!!!

+1

Tại sao bạn không nhìn vào 'errno' sau lệnh execl thất bại? Nó sẽ cho bạn biết thêm về vấn đề của bạn. Điều gì đã trở thành khi đọc trang người đàn ông cho execl một cách cẩn thận? :-) – Jens

Trả lời

27
execl("/home/vlc", 
    "/home/vlc", "/home/my movies/the movie i want to see.mkv", 
    (char*) NULL); 

Bạn cần chỉ định tất cả đối số, bao gồm argv[0] không được lấy từ tệp thực thi.

Cũng đảm bảo rằng số NULL cuối cùng được truyền tới char*.

chi tiết đang ở đây: http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html

+0

nó được giải quyết! cảm ơn người đàn ông! tôi đã dành hàng giờ trên cái này ..... –

+1

s/token/chụp? – Jens

+0

@Jens, đã được sửa. Đừng ngần ngại để sửa chữa nếu bạn thấy một cái gì đó xấu. – AProgrammer

1

Nếu bạn cần chỉ để thực hiện quá trình phát lại VLC của bạn và chỉ cung cấp cho kiểm soát lại quá trình ứng dụng của bạn khi nó được thực hiện và không có gì phức tạp hơn, sau đó tôi cho rằng bạn có thể sử dụng chỉ:

system("The same thing you type into console");

+0

Giữa việc sửa chữa sự hiểu lầm nhỏ trong các đối số execl và viết một hàm sẽ báo giá chính xác để vỏ có thể hoàn tác báo giá, tôi biết những gì tôi thích. – AProgrammer

+0

Tôi nghĩ rằng tôi nhận được quan điểm của bạn và sự thích hợp của bạn là hợp lý.Nhưng khi giao dịch với các nhu cầu đơn giản như vậy, có lợi ích nào khác của việc sử dụng execl() thay vì hệ thống(), ngoài việc tránh gây rối với các dấu gạch chéo ngược dòng trong hệ thống()? –

+0

Có thể có lý do bảo mật, nếu bạn có ví dụ một chuỗi được tạo ra như 'sprintf (buf," ls -la% s ", var)' mà bạn thực hiện với 'system (buf)', ai đó có thể cung cấp cho bạn tên tệp Ví dụ: 'somefile; rm -rf ~" '. – netigger

Các vấn đề liên quan