YouTube2Text

Semáforos POSIX Sin Nombre en Procesos Independientes, ejemplo en lenguaje C — Transcript

by juancarlosjromer · 3,046 words · 522 segments · language en · Watch on YouTube

Full transcript

  1. 0:00Bueno, muy buenos días. Hoy vamos a
  2. 0:02hacer un ejemplo con semáforos POSIX sin
  3. 0:05nombre en procesos independientes, así
  4. 0:08que bueno, vamos a explicar un poquito
  5. 0:10cómo se componen los procesos y después
  6. 0:12vamos a mostrar los códigos y los vamos
  7. 0:14a ejecutar.
  8. 0:15Bueno, adelante.
  9. 0:17Vamos a mostrar un ejemplo en lenguaje C
  10. 0:20con el objetivo de mostrar el uso de los
  11. 0:22semáforos POSIX sin nombre en procesos
  12. 0:25independientes.
  13. 0:27Vamos a hacer un ejemplo simple del
  14. 0:28punto de vista de la lógica
  15. 0:30para concentrarnos en los pasos que
  16. 0:33debemos ejecutar en los procesos para
  17. 0:36poder usar estos semáforos POSIX sin
  18. 0:39nombre.
  19. 0:41Bueno, aquí vemos la secuencia de
  20. 0:42ejecución de la sección crítica por
  21. 0:45parte del proceso A y el proceso B y esa
  22. 0:48sincronización nos va a permitir hacer
  23. 0:50una secuencia de ejecución PA PB PA PB
  24. 0:54PA PB PA PB. Sí, ese es el orden que eh
  25. 0:58la sincronización tiene que mantener
  26. 1:00para que los procesos eh accedan a su
  27. 1:02sección crítica casualmente en esa
  28. 1:05secuencia.
  29. 1:07Tenemos un proceso que se llama Create
  30. 1:10Shared Memory que lo vamos a utilizar
  31. 1:12casualmente para crear la memoria
  32. 1:14compartida.
  33. 1:15Este proceso eh vamos a tener tres pasos
  34. 1:18en términos generales. El primer paso es
  35. 1:21definir una estructura que va a tener
  36. 1:24dos variables de tipo de dato sem_t,
  37. 1:28o sea, semáforo POSIX.
  38. 1:31Eh decimos dos semáforos porque bueno,
  39. 1:33la sincronización PA PB PA PB va a
  40. 1:35necesitar mínimamente dos semáforos.
  41. 1:38El segundo paso es crear la memoria
  42. 1:40compartida POSIX para poder almacenar
  43. 1:43dicha estructura, o sea, que la
  44. 1:45estructura se va a almacenar en una
  45. 1:47memoria compartida y una memoria
  46. 1:48compartida POSIX, casualmente.
  47. 1:51Sí.
  48. 1:52Y el tercer paso es ajustar el tamaño de
  49. 1:55la memoria compartida al tamaño de la
  50. 1:57estructura que contiene los dos
  51. 2:00semáforos POSIX que nos va a servir, que
  52. 2:02nos van a servir para hacer esta
  53. 2:04sincronización.
  54. 2:06Vamos a tener un proceso eh que vamos a
  55. 2:08llamar initsem, que lo que va a hacer es
  56. 2:11inicializar los semáforos
  57. 2:13de manera tal que el semáforo A esté
  58. 2:18inicializado en uno y el semáforo B esté
  59. 2:20inicializado en cero.
  60. 2:22¿Sí?
  61. 2:23Para ello
  62. 2:24tenemos cuatro pasos: definir la
  63. 2:27estructura, que también se definió en el
  64. 2:30proceso create shared memory. Por
  65. 2:32supuesto que eh yo estoy repitiendo la
  66. 2:35estructura en cada uno de los procesos
  67. 2:37para que sea más simple para aquellos
  68. 2:39programadores que no son tan
  69. 2:40experimentados, pero bueno, un
  70. 2:42programador experimentado podría no
  71. 2:44repetir la estructura en cada proceso y
  72. 2:47guardar la estructura en un archivo de
  73. 2:49cabecera y después incluirlo en los
  74. 2:52otros procesos, pero bueno, eh este
  75. 2:55código está hecho para que se entienda.
  76. 2:58¿Sí? Entonces, eh este proceso initsem
  77. 3:01también va a definir la estructura que
  78. 3:04definió eh el proceso create shared.
  79. 3:07Después tenemos el apertura de la
  80. 3:10memoria compartida POSIX, que ya debería
  81. 3:12estar creada, si no la ejecución de este
  82. 3:16proceso va a dar error en ese paso.
  83. 3:19¿Sí? Después hay que mapear la memoria
  84. 3:21compartida en el espacio de direcciones
  85. 3:24del proceso de usuario. En este caso
  86. 3:26vamos a mapear el área de memoria
  87. 3:29compartida en el espacio de direcciones
  88. 3:31del proceso initsem
  89. 3:33para que pueda tener acceso a los
  90. 3:35semáforos, por supuesto, ¿no? Y después,
  91. 3:37bueno, el cuarto paso, inicializar los
  92. 3:40semáforos, ¿sí? Como dijimos antes, el
  93. 3:42semáforo A en uno y el semáforo B en
  94. 3:45cero.
  95. 3:47Por supuesto que vamos a tener el
  96. 3:49proceso PA
  97. 3:50que eh también va a definir la
  98. 3:52estructura y contiene los semáforos
  99. 3:54porque, eh, digamos, no usamos un
  100. 3:56archivo de cabecera.
  101. 3:58Eh, de la misma manera, el proceso PA va
  102. 4:00a tener que abrir la memoria compartida
  103. 4:02POSIX, igual que lo hizo el proceso
  104. 4:04initsem.
  105. 4:05También va a tener que mapear la memoria
  106. 4:07compartida dentro del espacio de
  107. 4:09direcciones del proceso de usuario PA.
  108. 4:12Y la diferencia está en el paso cuatro y
  109. 4:15cinco, que el proceso PA, por supuesto,
  110. 4:17va a tener que definir la sección de
  111. 4:18entrada a la sección crítica y va a
  112. 4:21tener que definir la, eh, salida, o sea,
  113. 4:25la sección de salida de la sección
  114. 4:26crítica, ¿sí?
  115. 4:28Por supuesto que vamos a tener un
  116. 4:29proceso PB y los pasos del proceso PB
  117. 4:32son los mismos pasos que el proceso A.
  118. 4:35¿Sí?
  119. 4:37Y por último, vamos a tener un proceso
  120. 4:39que llama Elimina Shared Memory, eh, que
  121. 4:42es un proceso muy simple y, de una línea
  122. 4:45de código.
  123. 4:46Eh, bueno, este proceso va a eliminar la
  124. 4:49shared memory, la memoria compartida.
  125. 4:53Bien, comenzamos a meternos más a nivel
  126. 4:55de detalle. Acá vemos el paso uno del
  127. 4:58proceso Crea Shared Memory, que era
  128. 5:00definir la estructura con los semáforos.
  129. 5:03Le pueden poner el nombre que quieran,
  130. 5:04yo le puse estructura, estruc, semáforo,
  131. 5:07le puse semáforos al, al estructura y,
  132. 5:10como ustedes ven, tienen dos tipos de
  133. 5:11dato, eh, sem_t.
  134. 5:14Eh, el primer tipo de dato sem_t, eh,
  135. 5:18define una variable que llamamos SA, le
  136. 5:21pueden poner el nombre que quieran.
  137. 5:23Y el segundo tipo sem_t define la
  138. 5:26variable SB y, repito, le pueden poner
  139. 5:29el nombre que quieran. Bueno, ahí
  140. 5:31tenemos la estructura que ahora vamos a
  141. 5:33usar.
  142. 5:35Bien, aquí estamos en el paso dos del
  143. 5:37proceso Crea Shared Memory.
  144. 5:39El proceso tiene que hacer una llamada
  145. 5:41al sistema Shared Memory Open.
  146. 5:43El primer argumento de la llamada es un
  147. 5:47cons char asterisco, eh es una cadena de
  148. 5:51caracteres y le recomendamos que el
  149. 5:53primer carácter sea una barra, ¿sí?
  150. 5:56Para, digamos, facilitar la la
  151. 5:58implementación.
  152. 6:00El segundo argumento son los flags de
  153. 6:02creación,
  154. 6:03create exclusivo y read write, eh create
  155. 6:08combinado con exclusivo lo que hace es,
  156. 6:11eh si ya existe el share memory open,
  157. 6:16y, bueno, el el o guion bajo read write,
  158. 6:19open read write, este, crea el área de
  159. 6:23memoria compartida para lectura y
  160. 6:24escritura.
  161. 6:25Y el tercer argumento son los modos de
  162. 6:28creación, en este caso, eh le das
  163. 6:32permiso de usuario al le da permiso al
  164. 6:34proceso de usuario para que pueda leer
  165. 6:37eh la memoria compartida y le da permiso
  166. 6:40al proceso de usuario para que pueda
  167. 6:42escribir la lec eh la memoria
  168. 6:44compartida, ¿sí?
  169. 6:47Bien, el paso tres del proceso crea
  170. 6:49share memory
  171. 6:51es llamar a la función ftruncate y de
  172. 6:53que tiene el primer argumento
  173. 6:56es lo que me devuelve el share memory
  174. 6:58open, es un entero, y el segundo
  175. 7:00argumento es eh la longitud de la
  176. 7:03estructura semáforos, ¿sí? De esta
  177. 7:05manera ajusta el tamaño de la memoria
  178. 7:07compartida a el tamaño de la estructura
  179. 7:10que va a guardar en esa memoria, ¿sí?
  180. 7:14Bien, acá tenemos el paso uno del
  181. 7:15proceso init sem,
  182. 7:17eh el primer paso es eh llamar a share
  183. 7:21memory open y la única diferencia que
  184. 7:23hay en el la llamada de init sem con
  185. 7:25respecto a la llamada de crea share
  186. 7:27memory
  187. 7:29es eh el segundo argumento. En este
  188. 7:32caso, ya el área de memoria compartida
  189. 7:34está creada, así que los flags de
  190. 7:37creación y de exclusivo no van,
  191. 7:39solamente en el segundo argumento va el
  192. 7:42flag de open the rewrite, nada más.
  193. 7:45Después el primer argumento y el tercer
  194. 7:47argumento son iguales.
  195. 7:49El paso dos del proceso init sem es el
  196. 7:51mapeo de la memoria compartida.
  197. 7:54La llamada al sistema es mmap y el
  198. 7:57primer argumento es la dirección de
  199. 7:58mapeo.
  200. 7:59Si ponemos null, eh, le decimos al
  201. 8:02sistema operativo que él, este,
  202. 8:05encuentre una dirección de mapeo. Así
  203. 8:08que bueno, es lo más conveniente.
  204. 8:10El segundo argumento es la longitud de
  205. 8:12la memoria a mapear, en este caso es la
  206. 8:15longitud o el tamaño del struct
  207. 8:17semáforos y por supuesto que el segundo
  208. 8:19argumento tiene que ser mayor que cero.
  209. 8:22El tercer argumento se refiere a la
  210. 8:24protección de memoria
  211. 8:26y ahí, eh, aparece prot read y prot
  212. 8:29write, eso quiere decir que las páginas
  213. 8:32de la memoria mapeada pueden leerse y
  214. 8:35las páginas de la memoria mapeada pueden
  215. 8:37escribirse.
  216. 8:39Eh, bueno, acá aparece el concepto de
  217. 8:41páginas, para entender lo que es el
  218. 8:43concepto de páginas hay que estudiar
  219. 8:45administración de memoria paginada.
  220. 8:47Así que lo vamos a dejar por el momento
  221. 8:49ese concepto.
  222. 8:51El cuarto argumento es un flag que
  223. 8:53indica que esta área de memoria mapeada
  224. 8:56se puede compartir, o sea, que si algún
  225. 8:59proceso que está mapeado sobre esta área
  226. 9:02de memoria hace una actualización, los
  227. 9:04demás procesos que están mapeados a esta
  228. 9:06misma área de memoria también van a ver
  229. 9:08las actualizaciones a las modificaciones
  230. 9:10que se hagan.
  231. 9:13El quinto argumento es el entero
  232. 9:15retornado por el share memory open
  233. 9:18y está indicando que vamos a mapear la
  234. 9:19memoria compartida.
  235. 9:22El sexto argumento
  236. 9:24es un desplazamiento dentro de la
  237. 9:26memoria compartida
  238. 9:28que indica a partir de qué
  239. 9:30desplazamiento se va a mapear la memoria
  240. 9:31compartida.
  241. 9:33En este caso cero está indicando un
  242. 9:35desplazamiento relativo a cero, o sea,
  243. 9:37un desplazamiento relativo al comienzo
  244. 9:41de la memoria compartida.
  245. 9:44El paso tres del proceso init sem es eh
  246. 9:46usar la llamada sem init. El primer
  247. 9:49argumento de la llamada sem init es la
  248. 9:51dirección de memoria de la variable
  249. 9:53correspondiente al semáforo.
  250. 9:57Esa variable está en la estructura
  251. 10:00mapeada en la dirección shm.
  252. 10:04¿Sí? Entonces, desde la dirección shm
  253. 10:08hacemos la referencia SA y ahí tomamos
  254. 10:11la dirección de SA, lo mismo para SB. El
  255. 10:15segundo argumento es eh un uno en este
  256. 10:19caso o algo distinto de cero,
  257. 10:22indicando que el semáforo se puede
  258. 10:24compartir entre procesos independientes.
  259. 10:27Si el segundo argumento fuera cero, el
  260. 10:30semáforo no se podría compartir,
  261. 10:32entonces habría que usarlo en un ámbito
  262. 10:34de hilos.
  263. 10:35Y el tercer argumento es el valor de
  264. 10:38inicialización del semáforo. En ese
  265. 10:40caso, el semáforo A lo inicializamos en
  266. 10:42uno y el semáforo B lo inicializamos en
  267. 10:45cero.
  268. 10:46Bien, el paso uno del proceso A
  269. 10:49es hacer la llamada a shm open y tiene
  270. 10:53el mismo formato que eh la que usó el
  271. 10:56proceso eh init sem, ¿sí? Porque el
  272. 10:59proces, perdón, porque la memoria
  273. 11:01compartida en este caso ya debería estar
  274. 11:03creada, así que no nos vamos a detener a
  275. 11:06explicarlo.
  276. 11:08El segundo paso del proceso PA es hacer
  277. 11:10la llamada mmap, o sea, mapear la
  278. 11:13mapear la memoria compartida
  279. 11:16eh y tiene el mismo formato que el mmap
  280. 11:19del proceso init sem, así que tampoco
  281. 11:22nos vamos a detener a explicarlo.
  282. 11:24El paso tres del proceso A es hacer la
  283. 11:27llamada sem wait sobre el semáforo A y
  284. 11:30hacer la llamada sem post sobre semáforo
  285. 11:33B.
  286. 11:33Bueno, el argumento de semwait es la
  287. 11:36dirección de memoria deseada, que por
  288. 11:39supuesto está referenciada por la
  289. 11:41dirección SHM.
  290. 11:43Si quieren entender un poquito más los
  291. 11:46símbolos ampersand y la flechita, pueden
  292. 11:48ver los vídeos que están en mi canal,
  293. 11:51que comienzan
  294. 11:52con el nombre Taller de C. Son los
  295. 11:54últimos cinco vídeos. Ahí explico el
  296. 11:56ampersand y explico la flechita, qué
  297. 11:58significa. La cuestión es que
  298. 12:01semwait, este, funciona como explican
  299. 12:04los libros de sistemas operativos la
  300. 12:07operación wait, y sempost funciona como
  301. 12:09explican los libros de sistemas
  302. 12:11operativos sobre, eh, las, digamos, las
  303. 12:15llamadas signal, ¿sí? O la operación
  304. 12:17signal sobre semáforos.
  305. 12:20Estamos viendo los pasos del proceso B.
  306. 12:22Los pasos uno y dos son iguales en el
  307. 12:25proceso A y en el proceso B.
  308. 12:27Y en el paso tres, por supuesto, lo
  309. 12:29único que cambia es, este, el wait, que
  310. 12:32ahora el proceso B tiene que hacer un
  311. 12:34semwait sobre el semáforo B
  312. 12:36y, eh, tiene que hacer un sempost sobre
  313. 12:38el semáforo A para que la sincronización
  314. 12:41funcione.
  315. 12:43Bien, aquí vemos el proceso elimina
  316. 12:45shared memory. Lo único que hace es una
  317. 12:46llamada shared memory unlink
  318. 12:49y el argumento es, eh, el string, mmm,
  319. 12:51la cadena que hace referencia a la
  320. 12:54memoria compartida, ¿sí? El mismo string
  321. 12:56que se usó en el shared memory open, en
  322. 12:59la creación de la memoria compartida.
  323. 13:01Bueno, ese, esa llamada shared memory
  324. 13:03unlink
  325. 13:05entonces, elimina el recurso.
  326. 13:09Bien, acá estamos viendo los pasos de
  327. 13:11compilación y vemos las líneas de
  328. 13:13compilación de cada uno de los procesos.
  329. 13:16Algunas líneas de compilación, eh,
  330. 13:18vinculan a la librería RT y algunas
  331. 13:21líneas de compilación vinculan a la
  332. 13:23librería RT y pthread.
  333. 13:26Pthread es para, eh lo que es el uso de
  334. 13:30llamadas para semáforos y RT es eh lo
  335. 13:34necesito para llamadas eh relacionadas
  336. 13:37con la memoria compartida, ¿sí?
  337. 13:41Bien, aquí estamos ya en el Raspbian. Eh
  338. 13:44vamos a ver un poquito cada uno de los
  339. 13:47procesos, sí, vamos a empezar con crea
  340. 13:49shared memory, ¿sí?
  341. 13:55Bien.
  342. 13:57Acá tenemos el código de crea shared
  343. 13:59memory. Bueno, todos los include que
  344. 14:02tenemos que hacer para las llamadas al
  345. 14:05sistema y las funciones que vamos a
  346. 14:06utilizar. Aquí está la estructura
  347. 14:09semáforos, ¿sí?
  348. 14:11Con eh la variable
  349. 14:13la variable SA
  350. 14:15de tipo sem_t
  351. 14:18y la variable SB de tipo sem_t, ¿sí?
  352. 14:22Semáforos posix sin nombre.
  353. 14:24Después tenemos en en el main tenemos eh
  354. 14:27la llamada a shared memory open, como lo
  355. 14:31dijimos ya previamente, devuelve un
  356. 14:33entero que sería el file eh descriptor
  357. 14:37de del objeto shared del objeto memoria
  358. 14:40compartida.
  359. 14:41Si es -1, entonces mostramos error eh
  360. 14:44shared memory memory open y terminamos.
  361. 14:48Si no dio error el shared memory open,
  362. 14:50que en este caso es crearla de forma
  363. 14:52exclusiva de lectura y escritura con los
  364. 14:55permisos este eh de lectura para el
  365. 14:58usuario y de escritura para el usuario,
  366. 15:01entonces si no da error, entonces
  367. 15:03ajustamos el tamaño de la memoria
  368. 15:05este como ya lo explicamos. Entonces
  369. 15:07usamos la función ftruncate, ¿sí? Le
  370. 15:10pasamos lo que nos devolvió eh shared
  371. 15:12memory open y el tamaño de la estructura
  372. 15:16semáforos. Si da error, entonces
  373. 15:19mostramos que dio error y terminamos el
  374. 15:22proceso. Y si no
  375. 15:23dio error
  376. 15:25mostramos memoria compartida posix
  377. 15:26creada y termina el proceso. Entonces
  378. 15:28acá tenemos la llamada share share
  379. 15:31memory open para crear y la función
  380. 15:35ftruncate para ajustar.
  381. 15:38¿Sí? Bien.
  382. 15:41Vamos a ver ahora init init sem.
  383. 15:52Muy bien, todas las cabeceras que
  384. 15:53tenemos que usar,
  385. 15:55la estructura,
  386. 15:57¿sí? Acuérdense lo que dijimos hoy.
  387. 15:59Dijimos, bueno, esto lo podríamos poner
  388. 16:01en un punto h también con todas las con
  389. 16:03todos los include, con todas las
  390. 16:04cabeceras, pero bueno, me parece que así
  391. 16:07se entiende un poco más.
  392. 16:09Eh entonces, bueno, declaramos la
  393. 16:11estructura de la misma manera que lo
  394. 16:13hicimos en el código de create share
  395. 16:15memory.
  396. 16:18Hacemos la apertura de la memoria
  397. 16:20compartida.
  398. 16:21Como ya lo explicamos, si da error, de
  399. 16:24nuevo mostramos en pantalla el mensaje y
  400. 16:27terminamos. Y si no da error, mapeamos,
  401. 16:30mapeamos el mmap, entonces nos devuelve
  402. 16:34un puntero
  403. 16:36a una estructura semáforos, o sea, nos
  404. 16:38devuelve una dirección de memoria
  405. 16:40a una estructura semáforos. Ese es el
  406. 16:42mapeo.
  407. 16:43¿Sí? Acuérdense lo que dijimos del
  408. 16:45mapeo, ¿no?
  409. 16:47Bueno, si da error, por supuesto,
  410. 16:49entonces mostramos un un mensaje en
  411. 16:51pantalla y termina el proceso.
  412. 16:54Y acá tenemos, como lo explicamos
  413. 16:55también, la inicialización de los
  414. 16:57semáforos, ¿sí?
  415. 16:59Si todo esto sale bien, entonces
  416. 17:01semáforos posix sin nombre
  417. 17:03inicializados. Si no,
  418. 17:05terminará
  419. 17:06en el error que dio en este caso share
  420. 17:09memory open, si lo da, el mmap, si lo
  421. 17:12da, el sem_init para el semáforo a, si
  422. 17:14da error, o el sem_init para el semáforo
  423. 17:17B, si agarro, ¿sí?
  424. 17:18Bien.
  425. 17:21Vamos a ver ahora el código del proceso
  426. 17:24A.
  427. 17:29De nuevo, acá
  428. 17:31declaramos la estructura semáforos,
  429. 17:33hacemos el open de la shared memory, tal
  430. 17:36cual lo hizo initsem, hacemos el mapeo
  431. 17:39de la memoria compartida en el espacio
  432. 17:41de direcciones del proceso,
  433. 17:43tal cual lo hizo initsem, y acá tenemos
  434. 17:46entonces el comienzo de la
  435. 17:48sincronización, un ciclo infinito,
  436. 17:51sí, ahí tenemos un ciclo infinito,
  437. 17:53sí, donde el proceso A lo único que va a
  438. 17:55decir sección crítica de PA, ¿sí?
  439. 17:58Y la sección de entrada entonces, como
  440. 18:00también ya lo explicamos, es el semwait
  441. 18:03sobre el semáforo A.
  442. 18:05Y la sección de salida es el sempost
  443. 18:08sobre el semáforo B.
  444. 18:13Ahora tenemos el proceso B, que es igual
  445. 18:17al proceso A,
  446. 18:19¿sí?
  447. 18:20Pero con la diferencia de que el semwait
  448. 18:23ahora es sobre el semáforo B y el
  449. 18:25sempost es sobre el semáforo A.
  450. 18:30Vemos el elimina shared memory.
  451. 18:40Fíjense que lo único que hace elimina
  452. 18:42shared memory es
  453. 18:43el shared memory unlink, ¿sí? De eh
  454. 18:47digamos el string de creación de la
  455. 18:50shared memory, ¿sí? Acá no hay que
  456. 18:52declarar la estructura semáforos,
  457. 18:55este, así que no no lo pusimos.
  458. 19:02Bien, vamos a mostrar
  459. 19:04compilar.
  460. 19:14Acá están las líneas de compilación de
  461. 19:16cada uno de los códigos. Crea shared
  462. 19:19memory, necesita la librería RT.
  463. 19:23Init sem necesita librería p3d y RT, PA
  464. 19:26necesita p3d y RT, PB necesita p3d y RT
  465. 19:31y RT y elimina shared memory RT.
  466. 19:35Así que
  467. 19:37bien.
  468. 19:38Bueno, vamos a compilar.
  469. 19:43Ahí compilamos, creó todos los
  470. 19:46ejecutables, ¿sí?
  471. 19:51Ahí tenemos todos los ejecutables, crea
  472. 19:53shared memory,
  473. 19:55elimina shared memory, init sem,
  474. 19:58proceso A, proceso B, ¿sí?
  475. 20:01Bien, vamos a eh abrir otra terminal.
  476. 20:09Ahí está.
  477. 20:14Bien, vamos a achicar esta.
  478. 20:24Vamos a limpiar la pantalla.
  479. 20:28Vamos a
  480. 20:33Bueno, bueno, eh en la terminal de la
  481. 20:36derecha vamos a ejecutar el proceso B,
  482. 20:39PB.
  483. 20:40Y ahí se ve ah, perdón, muy bien, me
  484. 20:42olvidé, me olvidé de algo, no puedo
  485. 20:44ejecutar PB porque tengo que crear la
  486. 20:46memoria compartida, entonces, pero voy a
  487. 20:48ejecutar elimina primero.
  488. 20:51Fíjense que si ejecuto elimina, elimina
  489. 20:54me dice memoria compartida no existe.
  490. 20:57Así que voy a crear la memoria
  491. 20:58compartida.
  492. 21:00Ahí está, memoria compartida pues sí
  493. 21:02creada. Si ahora ejecuto elimina,
  494. 21:05entonces memoria compartida eliminada,
  495. 21:08así que la voy a crear de nuevo.
  496. 21:10Ahí está, bien, memoria compartida posix
  497. 21:13creada. Ahora por supuesto tengo que
  498. 21:15hacer init.
  499. 21:16Bien, semáforos posix sin nombre
  500. 21:19inicializados, perfecto, entonces tengo
  501. 21:21la memoria compartida creada.
  502. 21:23Tengo los semáforos posix sin nombre
  503. 21:25inicializados,
  504. 21:27así que ahora lo que voy a hacer si
  505. 21:29ejecutar el proceso PB.
  506. 21:31Ahí está.
  507. 21:32PB share memory open devuelve file
  508. 21:35descriptor 3.
  509. 21:37Y ahora ejecuto PA.
  510. 21:41Sección crítica de A, sección crítica de
  511. 21:43B, bueno, AB AB, si le pusimos el sleep
  512. 21:461 para que se vea en la pantalla.
  513. 21:48Bien la sincronización, ¿no?
  514. 21:51Bueno, listo y ahí se van a quedar hasta
  515. 21:53el infinito, así que con esto mostramos,
  516. 21:55la idea era mostrar eh.
  517. 21:58Cómo implementar los semáforos posix sin
  518. 22:01nombre en eh procesos independientes,
  519. 22:04así que bueno. Espero que les sirva y
  520. 22:06dejamos ahí que el proceso A y el
  521. 22:08proceso B sigan hacia el infinito y el
  522. 22:11más allá, chao chao.

About this transcript

This page contains the full transcript of Semáforos POSIX Sin Nombre en Procesos Independientes, ejemplo en lenguaje C by juancarlosjromer, generated from the public captions YouTube serves with the video. The transcript has 3,046 words across 522 segments, with the original timestamps preserved so you can click any line to jump to that moment in the embedded player.

What you can do with it

Use the transcript to take notes, quote the speaker, build a study guide, generate a summary with ChatGPT or Claude via the YouTube Summary tool, or export it as a timed subtitle file with YouTube to SRT. You can also re-open it in the transcriber to translate the transcript into 100+ languages.

Free YouTube transcript tool

YouTube2Text is a free YouTube transcript generator — no signup, no daily limit. Paste any YouTube link and get the full transcript instantly, with timestamps, click-to-jump, translation to 100+ languages, AI prompts for ChatGPT, Claude, and Gemini, and exports to TXT, SRT, VTT, or Markdown.